バッチ ファイル内の %~dp0 の一貫性のない動作について理解する
%~dp0
(バッチ ファイルのディレクトリを取得する) の動作には奇妙な矛盾が見られます。バッチ ファイルが C# プログラムから起動されない限り、 バッチ ファイルのディレクトリが変更されても安定したままです。 この記事では、根本原因を説明し、解決策を示します。
問題の原因: cmd.exe による %~0 の処理方法
核心的な問題は、cmd.exe
が現在実行中のバッチ ファイルを表す変数 %~0
をどのように解釈するかに起因します。バッチ ファイルが引用符なしで実行される場合、cmd.exe
はバッチ ファイルのフル パスを含む内部変数を使用します。 ただし、バッチ ファイルが で 引用符で呼び出された場合、 cmd.exe
は %~0
の値から引用符を取り除き、それを単なるファイル名として扱います。 次に、絶対パスを相対的に解決しようとするため、一貫性のない動作が発生します。
解決策: 一貫性のないパス取得を修正する
バッチ ファイルの呼び出し方法に関係なく、一貫した %~dp0
動作を保証するための戦略を次に示します。
C# コード内:
cmd /c batchfile.cmd
)。 これが最も簡単な解決策です。%~0
が完全なパス情報を確実に受け取るようにします。バッチ ファイル内:
サブルーチンの例:
<code class="language-batch">@echo off setlocal enableextensions disabledelayedexpansion call :getCurrentBatchFilePath batchPath echo %batchPath% exit /b :getCurrentBatchFilePath variableName set "%~1=%~f0" goto :eof</code>
このサブルーチンはフル パス (%~f0
) を取得し、指定された変数に保存して、後で使用するための信頼できるパス参照を提供します。 互換性と堅牢性を最大限に高めるために、この方法をお勧めします。
以上がバッチ ファイルを直接実行する場合と C# から実行する場合で %~dp0 の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。