為什麼使用 Pushd 到 UNC 路徑後 %CD% 不起作用?

為什麼使用 Pushd 到 UNC 路徑後 %CD% 不起作用?

在批次檔中,我迭代文件中的 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 enabledelayedexpansioncmd啟動,cmd /v:on或必須在註冊表中啟用。最安全的方法是第一種,因為它不依賴任何外部配置或環境。

獎金測驗: 為什麼 %DestinationDirectory% 仍然按預期工作嗎?

相關內容