setlocalすると、スクリプト実行後の環境変数にセットするには、endlocalのあとでセットするしかない。
しかしセットしたい値はローカル変数に入っているので、endlocalの後では参照できない。
endlocalの後までローカル変数を持ち越す手段を講じる必要がある。
for の制御変数のスコープはdoのあとの文もしくはブロックであり、
setlocal/endlocalの影響を受けない。つまりローカル変数でない。
したがって、endlocalの前に、ローカル変数値をfor制御変数にセットしてendlocalの外で使う。
また、その後でまたsetlocalしたい場合、最初のsetlocal〜endlocalのスコープとは独立なので
最初のスコープのローカル変数を参照することは出来ない。スコープをまたがってのローカル変数の
引継ぎにもfor制御変数を使うことが出来る。
setlocal set A=local set B=result for /f "tokens=*" %%X in ("%A%") do ( ローカル変数の値を制御変数にセット for /f "tokens=*" %%Y in ("%B%") do ( endlocal set OUT=%%Y グローバルな環境変数へのセット setlocal set A=%%X スコープをまたがったローカル変数の引継ぎ ) ) echo %A%
追記:
もっといい方法があるので、この項、obsolete。