ネットワーク ディレクトリをローカル パスにマップし、そのローカル パスを (ローカル) 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%
;
PATH
echo
%
パーセント記号は二重にするとエスケープされ ( %%
)、アンパサンドは&
複数行のコードを 1 行に連結するための区切り文字で、キャレット でエスケープされることを学びましたが、二重引用符はSET 経由の変数内または の外でそのまま使用されるように見えるため、^
まだ困惑しています。また、コマンドは常に実行されるようです (キャレットでエスケープすることはできません) - SET 変数ステートメントの一部であってもです。"
echo
for
結局、このスクリプトをワンライナーに変換して、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%"