2

pushdここや他のサイトに関する多くの質問と回答を読みましたが、その圧倒的多数が UNC パスの問題に言及しています。しかし、私は別の問題を抱えており、ヒントが 1 つも見られませんでした。

Windows 10 x64 Enterprise (バージョン 1809) を使用して、コンソール ウィンドウ内から次のバッチ ファイルを実行しています。

@echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
pushd %DestDir%

私の問題は、それpushdが間違った方法で実行されているか、まったく実行されていないように見えることです。これは、バッチ ファイルが実行された時点ではなく、実行前のディレクトリにいることを意味します。c:\windows

問題を理解するための必死の試みでいくつかのことを試しました(これらのテストが意味をなさないことを知っています):

  • 引用c:\windows符で囲みます ( set DestDir="c:\windows")
  • 引用%DestDir%符で囲みます ( pushd "%DestDir%")
  • 遅延拡張がオンになっているため!の代わりに使用されます。%pushd "!DestDir!"
  • コンソール ウィンドウを起動しました 管理者として内部からバッチ ファイルを実行しました

ただし、遅延拡張をオンにしないと、期待どおりにpushd機能します。つまり、次のバッチ ファイルを実行した後、

@echo off
set DestDir=c:\windows
pushd %DestDir%

c:\windowsバッチファイルを実行する前にいたディレクトリに関係なく、実際に転送されました。

私は今のところかなりばかげていると思いますが、一生これに頭を悩ませることはできません. pushd遅延拡張がアクティブな場合に失敗する理由を誰か説明してもらえますか?

4

1 に答える 1

2

問題の理由はコメントで既に説明されていますが、これまでのところ解決策はありません。
この問題は、明示的に次のように解決できますendlocal

REM @echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
endlocal & pushd %DestDir%

最後の行は一度に解析されるため、行全体を実行する前に%DestDir%( の前に) その値に置き換えられます (監視するために実行)。endlocalecho on

于 2019-05-22T15:03:43.773 に答える