首頁 > 後端開發 > C++ > 為什麼從 C# 呼叫與直接呼叫時 %~dp0 批次檔路徑的行為不同?

為什麼從 C# 呼叫與直接呼叫時 %~dp0 批次檔路徑的行為不同?

Linda Hamilton
發布: 2025-01-09 21:51:42
原創
187 人瀏覽過

Why Does the %~dp0 Batch File Path Act Differently When Called from C# vs. Directly?

了解批次檔路徑引用的差異 (%~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# 執行:

  • 避免引用: 最簡單的解決方案是在從 C# 呼叫批次檔時避免使用引號。 使用 cmd /c batchfile.cmd 等指令代替 "cmd /c "batchfile.cmd"
  • 使用完整路徑: 如果引號不可避免,請始終在 C# 呼叫中提供批次檔的完整路徑。 這可確保 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板