DELAYED EXPANSIONSOで際限なく議論されている標準的な問題があります。
バッチが"Block statement"- に遭遇すると、これは通常、あなたのような多くの行にまたがる括弧付きのステートメントでIF EXISTあり、ステートメント全体が閉じ括弧まで解析され、この時点で、ANY%var%はその変数のそのままの値に置き換えられますWHEN THE STATEMENT IS解析済み
その結果、 yourはsince has no value AT PARSE TIMEECHO %olddirectory%に置き換えられ、実行すると報告されますが、ISは解析時に設定されるため、に置き換えられますECHOolddirectoryECHOECHO is On/Off progdataecho Found %progdata%echo Found C:\ProgramData
最も簡単な解決策は、ECHOステートメントを外部に移動することです。block
IF EXIST "%progdata%" (
echo Found %progdata%
SET oldDirectory="%progdata%\%datetime%"
)
echo Olddirectory=%oldDirectory%
(ステートメントが設定されていない場合にエコーするものを見つけるようolddirectory=に追加しました)echoolddirectory
値を表示する 2 番目に簡単な方法は、
IF EXIST "%progdata%" (
echo Found %progdata%
SET oldDirectory="%progdata%\%datetime%"
CALL echo %%oldDirectory%%
)
ここで、ECHOコマンドは のコンテキストでは展開されませんが、IFコンテキストCALLのランタイム値から環境を取得するのコンテキストで展開されIFます。
値を表示する 3 番目に簡単な方法は、コマンドのdelayedexpansionオプションを使用することです。setlocalNT バッチ コマンドは、従来から開始されます。
@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!
)