Windows cmd: バッチファイルから cmd を起動するコマンドをエスケープし、PATH に追加するコマンドを実行します。

Windows cmd: バッチファイルから cmd を起動するコマンドをエスケープし、PATH に追加するコマンドを実行します。

ネットワーク ディレクトリをローカル パスにマップし、そのローカル パスを (ローカル) PATH 変数に追加する cmd コマンド プロンプトが必要です。

期待どおりに実行される次のような .bat スクリプトを用意しました。

pushd \\NetworkPath\Users\myname\Downloads
chdir
SET CurrentDir="%~dp0"
SET var=%cd% & SET CDIR=`chdir`
for /f "usebackq" %%x in (`chdir`) do set bvar=%%x
SET PATH=%PATH%;%bvar%
@echo IT IS: %CurrentDir%, %var%, %CDIR%, %bvar% ;;; %PATH% ---  %CD%

cmd.exe基本的に、これはファイルを実行するときにnew の開始時に実行したいスクリプトです.bat。問題は、ネットワーク パスが「マウント」されると (たとえば、pushdが呼び出されたとき)、常に新しい異なるローカル ドライブ文字 (X:、Y:、Z: ...) が取得されるため、そのセッションの PATH に追加する前に、このローカル ドライブ パスに相当するものを検出する必要があることです (たとえば、 を使用)。また、最後に連結されたものがedであるのに、追加部分の前にセミコロンが常に 2 重になるchdir理由もわかりません。SET PATH=%PATH%;%bvar%;PATHecho

%パーセント記号は二重にするとエスケープされ ( %%)、アンパサンドは&複数行のコードを 1 行に連結するための区切り文字で、キャレット でエスケープされることを学びましたが、二重引用符はSET 経由の変数内または の外でそのまま使用されるように見えるため、^まだ困惑しています。また、コマンドは常に実行されるようです (キャレットでエスケープすることはできません) - SET 変数ステートメントの一部であってもです。"echofor

結局、このスクリプトをワンライナーに変換して、start.exe起動コマンドの引数として使用することはできません。バッチ ファイルは 2 つではなく、1 つだけにしたいことに注意してください。まず、このスクリプトを変数に保存して、デバッグ用にエコーできるようにしたいと思います。ここまでは、次のとおりです。

SET TCMD="" pushd \\NetworkPath\Users\myname\Downloads ^& chdir ^& SET CurrentDir="%%~dp0" ^& SET var=^%%cd^%% ^& SET CDIR=^(`chdir`) ^& SET PATH=%%PATH%%;%%CD%% ^& echo %%CurrentDir%%, %%var%%, %%CDIR%%, %%bvar%% ;;; %%PATH%% ---  %%CD%% ""
echo %TCMD%
start cmd.exe /k "%TCMD%"

問題 - 新しい cmd.exe は次のように始まります:

'""' is not recognized as an internal or external command,
operable program or batch file.

%CD%次に、前の新しいディレクトリではなく、元のディレクトリ (.bat スクリプトが開始されたディレクトリ) に移動します。

このように実行した場合、これらのいずれも新しいドライブ/パス名を取得しません。ただし、 は例外でfor /f "usebackq" %%x in (`chdir`)、これは実際には取得できません (出力は確認できます)。また、それほど一貫性があるようにも見えません (空であると報告される場合もあります)。

最初のスクリプトをエスケープして、2 番目のスクリプトの引数でワンライナーとして使用し、意図したとおりにターミナルstartを起動できるようにするにはどうすればよいでしょうか。cmd.exe

参考文献:

答え1

あなたは考えすぎです。木を見て森を見ていないようですね ;-)

まず、"%~dp0"現在実行中のスクリプトの場所を示します。ない現在のディレクトリ。

第二に、%CD%最後に現在のディレクトリを出力するために既に を使用していますが、PATH を拡張するときにこれを使用しないのはなぜでしょうか。

@echo off
pushd "\\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"

関連情報