次の方法で共有

テキストファイルの内容を1行ずつ読み取りそれを別の変数に代入しても、全て同じ値(最後の行)になってしまう。

Anonymous
2023-10-26T01:35:56+00:00

以下のような1行ずつ文字が入っているlist.txtがあります。

d

e

f

g

list.txから文字列を読み取り、それを別の変数zに代入する以下のようなtest.batを作成しました。

@echo off

for /f %%a in (list.txt) do (

rem 変数aの値を表示

echo a is %%a

rem 変数zに変数aの値を代入

set z=%a%

rem 変数zの値を表示

echo z is %z%

)

test.batを実行した結果は以下の通りです。

a is d

z is g

a is e

z is g

a is f

z is g

a is g

z is g

変数aの値はd、e、f、gと変わっているのでlist.txtを読み取れているようですが、

zの値は最初からgで変わりません。

何が問題なのか分からず困っております。アドバイス頂きたいと思います。どうぞよろしくお願いいたします。

家庭向け Windows | Windows 10 | 入力と言語

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2023-10-26T02:04:52+00:00

zの評価がfor文の()内を実行する前に行われるため、そのような動作になります。

()内は暗黙の裡にsetlocalされた状態になるので、zの代入値を取り出すこともできません。

@echo off <br><br>for /f %%a in (list.txt) do call :Myfunc %%a <br><br>exit /b <br><br> <br><br>:Myfunc <br><br>echo a is %1 <br><br>set z=%1 <br><br>echo z is %z% <br><br>exit /b

これならば、期待した動作になるでしょう。

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2023-10-26T04:02:00+00:00

    コメントありがとうございます。

    ご説明頂いているロジックは理解できておりませんが、追々確認していきたいと思います。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2023-10-26T04:01:09+00:00

    ご返信ありがとうございました。ご提示頂いたスクリプトで期待した結果になりました。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2023-10-26T02:23:09+00:00

    © ウィンドウズスクリプトプログラマ - Windows Script Programmer 2023


    当たり前の話。

    @echo off

    set x=x

    for %%I in (a b) do (

    echo %%I

    set x=%%I

    echo %x%

    )

    全体が1つの文。複文。全体読み込んだ時に環境変数の置換が行われる。

    文を分けるか、

    @echo off

    set x=x

    for %%I in (a b) do call :sub %%I

    goto :next

    :sub %1

    echo %1

    set x=%1

    echo %x%

    goto :eof

    :next

    遅延展開を使うか、それには%の代わりに!を使う方法と%をエスケープする方法があるが

    @echo off

    setlocal EnableDelayedExpansion

    set x=x

    for %%I in (a b) do (

    echo %%I

    set x=%%I

    echo !x!

    )

    @echo off

    set x=x

    for %%I in (a b) do (

    echo %%I

    set x=%%I

    call echo %%x%%

    )

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません