3

CDバッチ スクリプトから環境変数を使用して現在の作業ディレクトリを取得するためのヒントが一般的に投稿されています。ただし、別のバッチ ファイルを実行CDしても更新されません。call次に、cdコマンドは他のバッチ ファイルの新しいパスをエコーし​​ますが、%CD%(または!CD!) は更新されません。例:

@echo off
 cd %~dp0
 echo in %0: CD=%CD%
 pause
 call X:\testcall.cmd

C:\testcall.cmdこれをおよびとして保存しX:\testcall.cmd、 を実行しC:\testcall.cmdます。の値が変更されていないことがわかりますCD。これは依存していないようcallです。次のいずれも機能しません。

start /D <NEW_DIR> <OTHER_CMD_FILE>
start cmd /c <NEW_DIR>\<OTHER_CMD_FILE>
cmd /c <NEW_DIR>\<OTHER_CMD_FILE>
<NEW_DIR>\<OTHER_CMD_FILE>
cd %~dp0
pushd %~dp0

CDcd(コマンド)は正しいディレクトリを表示しますが、古い値を保持します。したがってCD、スクリプトの最初に次のように設定します。

set CD=%~dp0

...この変数がまだ設定されていない場合にのみcmd.exeが設定されると仮定します。CD真実?

4

5 に答える 5

4

診断

ある時点でCD変数を明示的に設定しました。これを行うと、現在の作業ディレクトリが自動的に反映されなくなります。これを元に戻すには、空に設定します。

set CD=

その後、再び作業を開始します。

どうしてこれなの?さて、自動 CD 変数が機能として導入されました。その変数名を既に使用している既存のスクリプトを壊したくなかっただけだと思います。したがって、明示的に設定すると、CMD は意図的に設定していると見なします。

討論

まず、親プロセスに明示的に設定されたCD変数がある場合、それは子プロセスに継承されます。

一方、これらのいずれかが%CD%親プロセスの値を更新するとは思わないでください。

start /D <NEW_DIR> <OTHER_CMD_FILE>
start cmd /c <NEW_DIR>\<OTHER_CMD_FILE>
cmd /c <NEW_DIR>\<OTHER_CMD_FILE>

これらはすべて新しいプロセスを作成し、新しいプロセスは独自の作業ディレクトリを変更します。これが親プロセスに影響を与えるとは思わないでください。

最後の 1 つは、OTHER_CMD_FILE が CD コマンドを実行しない限り、作業ディレクトリをまったく更新しません。

<NEW_DIR>\<OTHER_CMD_FILE>

別のディレクトリでスクリプトを実行したからといって、スクリプトの作業ディレクトリが変更されるわけではありません。スクリプトの作業ディレクトリは、スクリプトの場所に設定する必要はありません。

アドバイス

作業ディレクトリが特定のものに設定されていることに依存することは、一般的に悪い考えです。

おそらく次のようなものが必要です。

SET SCRIPT_DIR=%~dp0

次に、(たとえば)"%SCRIPT_DIR%\config.txt"を使用して、そのディレクトリ内のファイルを参照します。

または、現在のディレクトリに依存する場合は、使用しますcd /d %~dp0

于 2013-04-29T12:18:55.610 に答える
2

あなたのコメントから2つのバッチファイルを作成します

test1.bat - C:\tempにあります

@echo off
cd %~dp0
echo File %~f CD=%CD%
call X:\test2.bat

test2.bat - * X:*にあります

@echo off
cd %~dp0
echo File %~f CD=%CD%

C:\tempからtest1 it を開始すると、出力は次のようになります。

File C:\temp\test1.bat CD=C:\temp 
File X:\test2.bat CD=C:\temp

結果は絶対に正しいです!

絶対パスまたは相対パスを使用してバッチ ファイル (またはその他のプログラム) を開始しても、現在のディレクトリは変更されません。

CDは、使用した方法でドライブを変更できないため、 CD失敗したようです。

スイッチを追加する必要があります CD /d %~dp0

于 2013-05-08T09:32:42.520 に答える
0

script-directory を使用する%~dp0ことで解決できますが、通常はそうではありません。これはよりうまく機能します:

cd >tmpfile
set /P CD= <tmpfile
del tmpfile

CDこの解は、変数と一致しています。CD 現在のディレクトリが含まれます。現在のドライブのルート ディレクトリにない場合はスラッシュ文字で終わりません。によって印刷されたパスは、cdまさにそのように動作します。

私はこれを何年も使用していますが、CD明示的に設定しても問題はありませんでした。後でPWD(Bashのように)使い始めました。この変数は、MSDOS では予約されていません。ここでの私の質問は、「これらの行を削除できますか、それとも MSDOS のイディオムですか?」というものでした。

CD明示的に設定するのは悪いと書いている人もいます。なんで?MSODS は適切に設計されておらず、それ以上開発されていません。あなたがそれでできることは何でも合法です。悪い MSDOS プログラミングはありません - 良いハックと悪いハックだけです。この視点がこれほどまでに合法である言語を私は他に知りません。

于 2013-05-06T16:32:11.773 に答える