在批次檔中,我迭代文件中的 unc 路徑列表,使用 Pushd 將上下文更改為該位置,然後執行命令。 %CD% 給出前一個目錄的位置,而不是目前推送的目錄。
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=%CD% - expecting x:\ or x:\subpath here, but get previous directory
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
如何取得目前目錄?
答案1
%CD%
像它應該的那樣工作。你的問題是它被擴展了前你的for
循環甚至會運行。使用延遲擴展代替:
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=!CD!
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
中的變數擴展cmd
有點違反直覺。當語句被執行時,普通環境變數(形式%foo%
包括偽變量,如%date%
, , ...)被擴展%cd%
解析的,而不是執行時。像計數後面的區塊一樣do
作為單一語句,因此區塊中的每個變數都被其值替換前循環for
甚至運行。這意味著%CD%
被它所擁有的值取代前循環。毫不奇怪,這就是價值前這pushd
。
延遲擴展透過在語句之前擴展變數來解決這個問題被處決。不過,他們需要使用該!foo!
表格和它必須明確啟動setlocal enabledelayedexpansion
或cmd
啟動,cmd /v:on
或必須在註冊表中啟用。最安全的方法是第一種,因為它不依賴任何外部配置或環境。
獎金測驗: 為什麼 %DestinationDirectory%
仍然按預期工作嗎?