MGreen
@MGreen (M Green)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Batchファイル】モード切替バッチ、if文の結果がTrueのはずがFalseに。どこが間違っているかわからない。

Windows10上で、バッチファイルで簡単なAutomationコマンドを作っています。モード切り替えバッチです。
mode.txt に、manualと書いてあったら、change to automode?(y/n) と尋ねる。"y"と入力すると、mode.txtの中身をAutoに書き換え、「changed to Auto mode」と表示する。"n"と回答すると、mode is not changed. still "Manual" と表示する。(mode.txtの中身が"auto"のときは、その逆)

ような内容なのですが、今回テスト環境でためすと、change to Auto mode?(y/n) で"y"と入力したのに、mode.txtが書き換えられず、"mode is not changed.." と表示されてしまいます。

if 文の何かが間違っていると思うのですが、どうしても間違いを見つけ出すことができません。
以下のコマンドなのですが、どうしたら "y"を選択したときに上記のような仕様通り動いてくれるか、どなたかアドバイスいただけませんでしょうか?

@echo off
set "filePath=C:\test\mode.txt"
set /p mode=<%filePath%

echo current mode: %mode%

if /i "%mode%"=="manual" (
    echo change to Auto mode? (y/n^) 
    set /p choice=
    if /i "%choice%"=="y" (
        echo Auto > %filePath%
        echo Changed to Auto mode.
        echo to finish this command, please type any key.
        pause > nul
        exit /b
    ) else (
        echo mode is not changed, still "Manual".
        echo to finish this command, please type any key.
        pause > nul
        exit /b
    )
) else if /i "%mode%"=="Auto" (
    echo Change to Manual mode? (y/n^)
    set /p choice=
    if /i "%choice%"=="y" (
        echo Manual > %filePath%
        echo changed to Manual mode.
        echo to finish this command, please type any key.
        pause > nul
        exit /b
    ) else (
        echo mode is not changed, still "Auto".
        echo to finish this command, please type any key.
        pause > nul
        exit /b
    )
) else (
    echo Error: check the mode.txt
        echo to finish this command, please type any key.
        pause > nul
        exit /b
)

echo current modeは正しく表示されていますし、manual/Auto以外の文字列をmode.txtに入力しておくときちんとerrorになるため、"y"と入力したときの動作だけがうまくいっていない状態です。

以上、どなたかわかる方がいましたら、よろしくお願いいたします。

0

2Answer

動かしてみたところchoiceになにも入ってないですね:rolling_eyes:
自分ではうまく説明できないのですが標準入力を取得する前に評価されてしまう??ぽいです。
choiceを遅延環境変数にしてみたら取得できるようになりました。

1Like

Comments

  1. @MGreen

    Questioner

    ご回答ありがとうございます。さすがです!!こんな難しいことしたことないです:joy: 
    なんとなくリンク先の言ってることはわかります。コマンドはコードを一行ずつ認識しちゃうから時々うまくいかないことがある・・という感じでしょうかね。

    私もやってみましたが・・うまくいきません。
    setlocal enabledelayedexpansion
    end local

    ・コード全体を挟む
    ・if /i "%choice%"=="y" ( の行だけ挟む
    をやってみたのですが、改善されず。。

    Choiceを遅延環境変数にする というのは、具体的にはどのようにできましたでしょうか?

    リンク先の補足の
    cmdコマンドのオプション「/V:ON」を実行し、遅延環境変数を有効化する。
    とかでしょうか?スミマセン。

  2. setlocal enabledelayedexpansion
    は全体をはさんで、if文を
    if /i "!choice!"=="y" (
    にしてみるとどうでしょう?
    さくっと説明できたら良いんですが私もややこしくて人に説明できるほど噛み砕いて理解できておらず…

  3. @MGreen

    Questioner

    う、うごいた!!!(!) やったーーー!!ありがとうございます!!
    %をエクスクラメーションマークにすることを見落としており失礼しました。これは一人では絶対たどり着けませんでした。。きっと遅延環境変数の問題に以前もぶつかっておられたからアドバイスいただけたんですよね。本当にありがとうございますm(__)m

    簡単なコマンドばかりなのに、こんなに難しい内容が出てくるなんて、びっくりです。
    精進します!

    ※ちなみに先輩が同じようなコマンドを手元で動かしたら遅延環境変数気にしなくても動いたらしく、(本当に同じコマンドかわかりませんが) なかなか遅延環境変数は、やっかいそうですね。

    ご教示ありがとうございました!

  4. まさにそうなんです:joy:
    バッチは一部を切り出すとうまくいくのに合体させると動かない…なんてことが多いんですよね…。
    一緒に頑張りましょう…。

mode.txtに、改行コードが付加されていませか?
それを読み込んで if文で判断するときに、改行コードのせいで、どれとも不一致になるのでは?

0Like

Comments

  1. 改行なしでechoすると、上手くいきますね。

    -        echo Auto > %filePath%
    +        echo|set /p="Auto" > %filePath%
    
    -        echo Manual > %filePath%
    +        echo|set /p="Manual" > %filePath%
    
  2. @MGreen

    Questioner

    mode.txtに改行・・・は、ないと思っています。ただ、manualとあるだけ。。
    うむむ。
    mode.txt.PNG

  3. それは、手で書いた”manual”では?
    echoで出力すると、”Manual”か”Auto”ですから。

  4. @MGreen

    Questioner

    ちょっともう少し考えてみます!実は、まだ初心者すぎて、ついていけません・・・echo|Set /p がどういう意味なのかまだわかっていないので、調べます!

  5. やってみて、上手くいってから「調べて理解する」でよいと思います。

    C:\> echo Hello
    Hello
    
    C:\> echo|set /p="Hello"
    Hello
    C:\>
    
  6. @MGreen

    Questioner

    ありがとうございます!勉強します。まずは動かしてみます!
    ちなみに今回の問題に関してはほかの方が回答いただいたように「遅延環境変数」の問題でした。。(なんじゃそりゃという領域)

    nak435様もご教示誠にありがとうございました。引き続きよろしくお願いいたします。

  7. @MGreen

    Questioner

    わー、今更ですが echo|set /="manual">"filepath"の意味がわかりました!最後に改行が入らないんですね!これも必須のアドバイスでした・・・・。今やっとわかりました。ありがとうございます!!

Your answer might help someone💌