我一直在用StackOverflow之類的線程研究過很多,但儘管我覺得我接近解決方案,但這個問題讓我頭疼。處理Windows批處理文件for循環中的變量
我在做什麼:當連接一個特定的外部硬盤驅動器(通過WMIC上的VolumeSerialNumber進行區分)時,驅動器號被發現,鏡像通過robocopy完成。該腳本通過雙擊執行。這是我到目前爲止有:
FOR /F "skip=1" %%i in ('wmic logicaldisk where VolumeSerialNumber^="XXXXXXXX" get deviceid 2^>nul') DO (
SET y=%%i
IF [%y%]==[] GOTO hdmissing
SET "backuphd=%%i"
GOTO endfor
)
:endfor
robocopy "C:\Users\Herbert\Documents" "%backuphd%\Backup\Documents" /MIR
ECHO Backup done
ECHO end
:hdmissing
ECHO Couldn't find external drive
:end
PAUSE
這樣,外部HD是永遠不會檢測(%y%
始終是一個空字符串)。但是,如果我在同一個控制檯會話中執行兩次腳本,一切都按預期工作。但我希望它能在第一次執行時工作。
這是我到目前爲止已經試過:
- 將
SET y=dummy
在腳本的開始。高清總是發現,觸發備份到C:如果HD實際上並沒有連接(顯然SET y=%%i
不會改變y
?) - 變化
%y%
到!y!
- 高清總是發現,再次
謝謝,我不完全意識到延遲擴展的工作原理。如果我有足夠的聲望,我會提高你的答案,但我解決了它的不同(見我的詳細答案)。在延期爆炸下逃跑是一場噩夢。 'IF [%% i] == [] GOTO hdmissing'不能正常工作,因爲[WMIC在最後返回](http://stackoverflow.com/questions/19471675/removing-carriage-return -from-wmic-output),並且這似乎不被解釋爲換行符,而是作爲自己的字符。我想'SET Y = %%我'擺脫了。 '如果沒有定義y GOTO hdmissing'在我的機器上無法使用。 –
user2009388