86063


以下のようなコマンドを.batに記述し、win10にて実行しました。  
「2」を選択した時、`myValue`が「after」にならない理由が分かりません。

お詳しい方、お知恵拝借できましたら大変幸いです。

[code]

    @echo off
    set myValue="before"
    
    SET /P selected="select y,n,2："
    if /i {%selected%}=={y} (goto yes)
    if /i {%selected%}=={yes} (goto yes)
    if /i {%selected%}=={2} (
      echo this is %myValue%
      set myValue="after"
      echo this is %myValue%
      pause
    )
    :yes
      echo end
    pause
    
[/code]


CC BY-SA 4.0
2022-02-01T05:05:50.453
86060
2022-02-01T07:20:39.227
2022-02-01T07:20:39.227
3060
46877
question
batch-file
batファイル実行時、if内でsetが効かない


それは`遅延環境変数の展開`というもので、IFやFORの中での環境変数の変更には設定と工夫が必要になります。  
コマンドプロンプトで`HELP SETLOCAL`と実行すると説明の一部が表示されます。

他にはこの辺の記事で使い方が解説されています。  
[【BAT】IF文やFOR文の括弧内で変更した変数の値を取得する方法](https://qiita.com/yaju/items/79f4f39559b1e1a343da)

>   * `setlocal enabledelayedexpansion`と`endlocal`で囲む
>   * 遅延評価したい環境変数は`%`ではなく`!`で囲む
>

[batファイル 遅延変数のサンプル(if文/for文の注意点)](https://itsakura.com/windows-batfile-delay)  
[cmdのforやif内値代入！setできない原因は遅延環境変数！](https://jisakupc-
technical.info/programing/491/)

* * *

一方注意する必要もあったりするので、こんな記事もあります。  
[SetLocal
EnableDelayedExpansionの罠とその回避方法](https://qiita.com/yz2cm/items/4983be006116c369d08b)  
[bat を遅延環境変数を使わないように書き換える](https://blog.cles.jp/item/11244)

* * *

質問のように文字列を表示するくらいだと以下のように最初の方と最後に挿入してIFの中の`%`を`!`に変えれば良いでしょう。

[code]

    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    set myValue="before"
    
    SET /P selected="select y,n,2："
    if /i {%selected%}=={y} (goto yes)
    if /i {%selected%}=={yes} (goto yes)
    if /i {%selected%}=={2} (
      echo this is !myValue!
      set myValue="after"
      echo this is !myValue!
      pause
    )
    :yes
      echo end
    pause
    ENDLOCAL
    
[/code]


CC BY-SA 4.0
2022-02-01T05:36:32.320
86063
2022-02-01T05:50:27.860
2022-02-01T05:50:27.860
26370
26370
86060
answer