DELAYED EXPANSION
SOで際限なく議論されている標準的な問題があります。
バッチが"Block statement"
- に遭遇すると、これは通常、あなたのような多くの行にまたがる括弧付きのステートメントでIF EXIST
あり、ステートメント全体が閉じ括弧まで解析され、この時点で、ANY%var%
はその変数のそのままの値に置き換えられますWHEN THE STATEMENT IS解析済み
その結果、 yourはsince has no value AT PARSE TIMEECHO %olddirectory%
に置き換えられ、実行すると報告されますが、ISは解析時に設定されるため、に置き換えられますECHO
olddirectory
ECHO
ECHO is On/Off
progdata
echo Found %progdata%
echo Found C:\ProgramData
最も簡単な解決策は、ECHO
ステートメントを外部に移動することです。block
IF EXIST "%progdata%" (
echo Found %progdata%
SET oldDirectory="%progdata%\%datetime%"
)
echo Olddirectory=%oldDirectory%
(ステートメントが設定されていない場合にエコーするものを見つけるようolddirectory=
に追加しました)echo
olddirectory
値を表示する 2 番目に簡単な方法は、
IF EXIST "%progdata%" (
echo Found %progdata%
SET oldDirectory="%progdata%\%datetime%"
CALL echo %%oldDirectory%%
)
ここで、ECHO
コマンドは のコンテキストでは展開されませんが、IF
コンテキストCALL
のランタイム値から環境を取得するのコンテキストで展開されIF
ます。
値を表示する 3 番目に簡単な方法は、コマンドのdelayedexpansion
オプションを使用することです。setlocal
NT バッチ コマンドは、従来から開始されます。
@echo off
setlocal
echoing
ローカル環境を抑制して確立します。のコンテキストendlocal
で または ファイルの終わりに達すると、ローカル環境への変更はすべて取り消されます。setlocal
このマントラが一貫して守られている場合、あるバッチで変数が確立され、次のバッチで環境が「汚れている」という状況は発生しません。cmd
同じセッション内でオリジナルを 2 回実行することを検討してください。progdata
、および確立している他のすべての変数は再臨のために設定されたままになります-したがってolddirectory
、最初の呼び出しで設定され、何らかの理由で2番目に明示的に設定されていない場合、その古いデータを保持します。setlocal
これらすべての変更をバックアップします。
setlocal enabledelayedexpansion
ミックスに余分な機能を追加します。%var%
は のPARSE -TIME値に解決されますが、が呼び出されたvar
場合はRUN-TIME値に解決されます -ループ内で変化するため...delayedexpansion
!var!
FOR
したがって、追加
SETLOCAL ENABLEDELAYEDEXPANSION
戦略的なポイントで (後@echo off
輪から離れるまで...)、表示を簡単に変更できます。olddirectory
IF EXIST "%progdata%" (
echo Found %progdata%
SET oldDirectory="%progdata%\%datetime%"
echo !oldDirectory!
)