3

ドライブレターを変数に保存すると、予期しない出力が発生%0します。

次のスニペットはC:\Temp\Testから実行されます。

@echo off
for %%I in ("%~0") do set "Target=%%~dI"
echo Target:  %Target%
pushd %Target% && echo Current: %CD% || echo Failed to change dir!

Targetこれは、現在のディレクトリではなく、正しい値を出力します。

Target:  C:
Current: C:\Temp\Test

期待される出力:

Target:  C:
Current: C:\

展開を遅らせて同じコードも試しましたが、これもうまくいきませんでした。ここで何が起こっているのか誰か説明できますか?

4

3 に答える 3

4

問題は変数の拡張ではなく、pushd動作にあります。

pushdこのシナリオは、 (またはcdところで)どのように機能するかを説明するかもしれません

C:\>cd temp
C:\temp>_

%cd%c:\tempです。別のドライブに「移動」した場合

C:\temp>e:

試してみてください

E:\>pushd c:
C:\temp>_

あなたが期待していたようにではなく、今%cd%が戻ってきたことを確認してください。C:\tempC:\

しかし

C:\temp>e:
E:\>pushd c:\
C:\>_

あなたが期待していたように%cd%もたらします。C:\

したがって、.BATファイルは単純に次のように記述できます。

pushd %~d0\
于 2013-02-14T10:14:07.427 に答える
1

なぜあなたは期待していますCurrent: C:\か?
からスクリプトを実行しますC:\Temp\Test。したがって、 に展開する
のは正しいです。%CD%C:\Temp\Test

%CD%使用するにつれて変化することが予想される場合PUSHD %target%は、行を分割するか、 の遅延展開を使用する必要があり!CD!ます。これは、実行前に最初に完全な行が解析され、パーセント展開が行われるためPUSHDです。

もう1つの問題は、相対パスのpushd C:ようにパスを変更しないことC:です。使用する必要がありますC:\

@echo off
set "Target=%~d0\"
setlocal EnableDelayedExpansion
echo Target:  %Target%
pushd %Target% && echo Current: !CD! || echo Failed to change dir^^!
于 2013-02-14T09:19:20.793 に答える