環境遅延変数の原因と2つのポイント
概要
最近、for文でがっつりはまりました。。。
以下のfor文はファイルの中身を1行ずつ読み取り、
full_nameをechoするもの。この例センスない...
hoge.txtの中身は
@echo off
set name=hoge
for /f %%a in (hoge.txt) do (
set full_name=%%a%name%
echo %full_name%
)
このメッセージ「ECHOはOFFです。」はECHOした変数が初期化されているときに出力されるメッセージです。
つまり、変数full_nameは初期化状態のまま、出力されているということになります。
これが謎でした...
原因
この原因は、変数を読み込むタイミング
が問題でした。
%で囲まれた変数はその行の読み始めで展開される
()で囲まれたコマンドは1行とみなされる
のです。まじ謎。
つまり、何度for文を回そうとも、full_nameが初期化状態でechoされていたのです。
環境遅延変数
これを解決するのが、環境遅延変数
です。
環境遅延変数とは、変数を読み込むタイミングを遅延させることができる変数で以下のように表します。
- 変数を%で囲わず、!で囲む
- setlocal enabledelayedexpansionを書く
修正したread.batはこちら
@echo off
setlocal enabledelayedexpansion
set name=hoge
for /f %%a in (C:\work\hogehoge\hoge.txt) do (
set full_name=%%a%name%
echo !full_name!
)
実行結果は以下のようになり、full_nameが変更されて出力されています。
まとめ
通常、変数を読み込むタイミングは
その行の読み始めで、()で囲まれたコマンドは1行とみなされる
環境遅延変数を用いれば、このタイミングを直前に変更でき、その方法は
1. ()で囲まれたコマンドは1行とみなされる
2. setlocal enabledelayedexpansionを書く
Author And Source
この問題について(環境遅延変数の原因と2つのポイント), 我々は、より多くの情報をここで見つけました https://qiita.com/n-nabe/items/b54bab5e03f9ce04ede6著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .