ホームページ >バックエンド開発 >C++ >バッチ ファイルが直接実行された場合と C# 経由で実行された場合とで、%~dp0 が異なる結果をもたらすのはなぜですか?

バッチ ファイルが直接実行された場合と C# 経由で実行された場合とで、%~dp0 が異なる結果をもたらすのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-09 21:49:45334ブラウズ

Why Does %~dp0 Yield Different Results When a Batch File is Executed Directly vs. via C#?

バッチファイル内の%~dp0 パス参照の違い

背景:

バッチ ファイル内で、%~dp0 はバッチ ファイルの現在の場所のディレクトリ パスを表します。現在のディレクトリ (CD) を変更する場合、通常、%~dp0 の値が新しいディレクトリを反映するように更新されることが予想されます。

質問:

ただし、ユーザーは、C# プログラムを通じてバッチ ファイルを実行するときの %~dp0 の動作の違いを観察しています。 %~dp0 は、直接実行すると元の値を保持しますが、C# から呼び出すと変更されます。

分析:

この違いは、バッチ ファイルが引用符で呼び出されたときの %~0 (未変更のバッチ ファイル名) の処理方法によるものです。

  • 直接実行: %~0 が引用符で囲まれている場合、引用符は削除され、完全なバッチ ファイル パスを使用して %~dp0 が決定されます。
  • C# 実行: C# で %~0 が引用符で囲まれている場合、引用符で囲まれていない文字列がバッチ ファイルの検索に使用されます。これにより、相対パスが作成され、%~dp0 値が不正確になる可能性があります。

解決策:

この問題を解決するには、次の 2 つの方法をお勧めします:

C# コードから:

  • バッチ ファイルを呼び出すときは引用符の使用を避けてください: ProcessStartInfo.FileName = "mybatfile.bat";
  • 引用符が必要な場合は、%~dp0 が正確であることを確認するために完全なバッチ ファイル パスを指定してください。

バッチ ファイルから:

  • サブルーチンを使用して、実行方法に関係なく現在のバッチ ファイルのパスを確実に取得します:
<code class="language-batch">@echo off
    setlocal enableextensions disabledelayedexpansion

    call :getCurrentBatch batch
    echo %batch%

    exit /b

:getCurrentBatch variableName
    set "%~1=%~f0"
    goto :eof</code>

以上がバッチ ファイルが直接実行された場合と C# 経由で実行された場合とで、%~dp0 が異なる結果をもたらすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。