0

バッチファイルがあり、バッチファイル内で特定のディレクトリを検索し、最初のディレクトリ/ファイルの名前である変数に保存します。これが大まかに私がやっていることです:

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF
    set NAME_DIR=%INSTALL_DIR%\dir\%NAME%
    goto :break
)

コマンドラインからこれを実行すると、完全に機能し、NAME_DIR は正しい値を取得します。ただし、ファイルをダブルクリックすると、NAME 変数が空白になります。したがって、NANE_DIR は %INSTALL_DIR%\dir に設定されます。なぜこれが起こるのか、どうすれば修正できますか?

より明確にするために、コマンドラインから、これは、エコーされたときに NAME と NAME_DIR が等しいものです。

NAME:      dir1.3.8
NAME_DIR:  D:\root\path\to\dir\dir1.3.8

これは、ダブルクリックしたときにエコーされるものです。

NAME:      
NAME_DIR:  D:\root\path\to\dir
4

1 に答える 1

2

コメントでRaymondChenが私に言ったことはうまくいきました! 遅延拡張を使用する必要がありました。これは、Windows が for ループを 1 つの命令として実行するため、for ループを実行する前にすべての変数を一度に入力するためです。for ループの前に NAME を設定したことがないので、何も評価されません。したがって、NAME_DIR は %NAME% の代わりに空の文字列を取得します。コマンド ラインでスクリプトを最初に実行したとき、機能しないことに気付きました。もう一度実行したところ、うまくいきました。私はそれを実行し続け、毎回機能しました。これは、for ループを 1 回実行した後、変数が保存され、変更されないためです。次回コードを実行すると、変数は空白ではなく、正しい値になります。ダブルクリックすると、NAME 変数は最初は null になります。for ループの実行後、NAME の値が更新されます。スクリプトが実行されて cmd ウィンドウが終了すると、変数の新しい値が失われ、最初からやり直されます。展開が遅れた新しいコードは次のとおりです。

setlocal ENABLEDELAYEDEXPANSION

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF
    set NAME_DIR=%INSTALL_DIR%\dir\!NAME!
    goto :break
)

setlocal ステートメントに追加し、次のように変更%NAME%しました!NAME!

于 2013-05-07T13:50:08.353 に答える