このコードが期待どおりに機能しないのはなぜでしょうか。
@ECHO off
SET S1=HELLO
SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!
ECHO %S1%
PAUSE
出力:
HELLO WORLD!
!S2!
期待される出力:
HELLO WORLD!
HELLO WORLD!
ありがとう。
このコードが期待どおりに機能しないのはなぜでしょうか。
@ECHO off
SET S1=HELLO
SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!
ECHO %S1%
PAUSE
出力:
HELLO WORLD!
!S2!
期待される出力:
HELLO WORLD!
HELLO WORLD!
ありがとう。
期待どおりに動作します。
遅延展開は、解析時ではなく実行時に変数を展開するため、行は次のように解釈さENDLOCAL & SET S1=!S2!
れますが、遅延展開
endlocal
の一部SET S1=!S2!
がオフになっているため、これ以上展開できません。
あなたの場合、使用できます
ENDLOCAL & SET S1=%S2%
エクスクラメーション マークが遅れているので、S2 は「安全」です。実行時にオフです。
しかし、常に安全な復帰はもう少し複雑です。
Dostipsで説明しました: ENDLOCAL 境界を越えて ANY 文字列を返す