2017-07-19 37 views
1

我正在爲我的IT部門編寫一個小庫存腳本,並且在嘗試節省自己一段時間時遇到了一個小絆腳石。批處理變量在執行時不擴展

我的目標是將當前位置存儲在臨時本地文件中(此批處理文件將在閃存驅動器上運行),以便在從一臺計算機移動到下一臺計算機時,只需更改位置即可不準確。基本上,如果我從A號樓1號單元3號廳開始,我只需確認什麼是正確的,然後改變什麼是不正確的。

也許位置確認碼可以讓您更好地瞭解這裏發生了什麼。

@echo off 
setlocal 
setlocal EnableDelayedExpansion 
if not exist location.tmp (
    echo , , > location.tmp 
) 
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
     set unit=%%i 
    ) 
    if not "%%j" == " " (
     set building=%%j 
    ) 
    if not "%%k" == " " (
     set room=%%k 
    ) 
) 
for %%i in (unit,building,room) do (
    call :SUB_GET %%i 
) 
echo !unit!,!building!,!room!> location.tmp 
endlocal 
exit /b 0 

:SUB_GET 
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF 
) 
set /p new%1=What %1? (default is !%1!) 
if not "!new%1!" == "" (
    set %1=!new%1! 
) 

一切工作,除了當我試圖讓它保持默認。如果數值正確,我希望能夠按回車鍵(例如,「什麼房間?(默認爲403)」命中輸入,然後它保持403)

問題是,當我這樣做,即使代碼檢查新的環境變量(輸入)以查看它是否爲空,它仍然將新變量的值賦給新變量(空字符串)。

更令人困惑的是,如果我使用默認值(如1,A,4)創建一個現有的location.tmp,並按回車確認每一個,批處理語句echo !unit!,!building!,!room!>location.tmp將執行,但location.tmp不變。

任何想法這裏發生了什麼?

回答

2
set /p %1=What %1? (default is !%1!) 

如果你簡單地回覆輸入set /p則變量保持不變。

所以 - 不需要new%1 - 即使那麼new就足夠了,因爲沒有明顯需要newROOM等等。您必須明智地清除new以避免保留陳舊的數據。

+0

哦哇,這簡化了事情。我永遠無法克服批處理腳本真的是多麼奇怪,毫無必要地令人費解,但也許有一天我會知道足夠不想一直尖叫它。謝謝! – Tyg13

0

行0123'中變量的延遲執行導致它們被擴展得太晚,因此語句無論什麼原因都無法正確執行。用正常的%變量%替換它們可以解決這兩個問題。事實證明,比較工作正常,只是沒有及時擴大。

編輯:不知道爲什麼,但以上是不正確的。下面的腳本運行完美...

@echo off 
setlocal 
setlocal EnableDelayedExpansion 
if not exist location.tmp (
    echo , , > location.tmp 
) 
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
     set unit=%%i 
    ) 
    if not "%%j" == " " (
     set building=%%j 
    ) 
    if not "%%k" == " " (
     set room=%%k 
    ) 
) 
for %%i in (unit,building,room) do (
    call :SUB_GET %%i 
) 
echo !unit!,!building!,!room!> location.tmp 
endlocal 
exit /b 0 

:SUB_GET 
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF 
) 
set /p %1=What %1? (default is !%1!)