了解批次檔路徑引用的差異 (%~dp0)
批次檔中 %~dp0
的行為可能會有所不同,這取決於批次檔的執行方式,特別是在比較直接執行與從 C# 程式執行時。這種差異源自於 cmd.exe
處理 %~0
變數及其修飾符的方式。
問題:
考慮一個包含以下行的批次檔:
<code class="language-batch">echo %~dp0 cd Arvind echo %~dp0</code>
直接運行時,將目錄更改為“Arvind”不會影響%~dp0
的輸出。 但是,如果從 C# 程式呼叫同一個批次文件,第二個 echo %~dp0
將 反映新目錄(“Arvind”)。
根本原因:
核心問題在於cmd.exe
對%~0
的解讀。 %~0
變數與 ~d
(磁碟機號)和 ~p
(路徑)等修飾符一起,從目前執行的批次檔的內部表示中存取資訊。
關鍵的區別在於引用如何影響這個內部引用。 如果 %~0
未加引號,則內部引用正確指向批次檔的完整路徑。 但是,如果對批次檔的呼叫加了引號(這在 C# 互動中很常見),cmd.exe
會移除引號,可能會導致相對路徑解釋而不是絕對路徑。 然後,此相對路徑解釋會根據目前工作目錄而變更。
解:
對於 C# 執行:
cmd /c batchfile.cmd
等指令代替 "cmd /c "batchfile.cmd"
。 cmd.exe
具有正確的絕對路徑,無論工作目錄為何。 對於批次檔執行:
<code class="language-batch">@echo off setlocal enableextensions disabledelayedexpansion call :getCurrentBatchPath myBatchPath echo %myBatchPath% cd Arvind echo %myBatchPath% exit /b :getCurrentBatchPath set "%~1=%~f0" goto :eof</code>
此子程式使用 %~f0
(始終提供完整路徑)將路徑儲存在指定變數中(此範例中為 myBatchPath
)。 即使在更改目錄後,該變數仍保持一致。
以上是為什麼從 C# 呼叫與直接呼叫時 %~dp0 批次檔路徑的行為不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!