2

入力を受け取り、簡単な計算を行う短いバッチ ファイル プログラムに取り組んでいます。最初のエコー以外はすべて正しく動作しているようです。コードは次のとおりです。

set /p usercommand= "Input:"
if "%usercommand%" equ "done" (

set /p usertimeouthours= "Input Hours: "
echo (%usertimeouthours%)

set /p usertimeoutminutes= "Input Minutes: "
echo (%usertimeoutminutes%)

set /p usertimeoutseconds= "Input Seconds: "
echo (%usertimeoutseconds%)

set /a answer= %usertimeouthours%*3600+%usertimeoutminutes%*60+%usertimeoutseconds%
echo %answer%

goto end
) else (
echo finished
goto user
)
:end 

最初のエコーのみが出力されるのはなぜですか

(

私の推測では、if ステートメントに何か問題があると思います。変更方法を知っている人はいますか?

ありがとう!

4

1 に答える 1

1

問題 1 - 変数の通常展開と遅延展開
通常の 展開使用%var%は解析時に発生し、括弧内の内容を含む IF ステートメント全体が一度に解析されます。したがって、次のようなものecho (%usertimeouthours%)は、IF ステートメントが実行される前 (SET /P が値を設定する前) に存在していた USERTIMEOUTHOURS の値を表示します。

修正は、 の代わりにsetlocal enableDelayedExpansionand を使用して上部で遅延展開を有効にすることです。展開の遅延は、解析時ではなく実行時に発生します。!var!%var%

問題 2 - エスケープ
されていない特殊文字 特殊な意味を持ち^、その文字を文字列リテラルとして扱いたい場合は、エスケープするか引用符で囲む必要がある文字がいくつかあります。

特殊文字の 1 つに). (エスケープまたは引用されていない限り、で開かれたコードブロックを終了します。^)これらのステートメントは括弧で囲まれたコード ブロック内にあるため、ECHO ステートメントで使用する場合と同様に、その文字をエスケープする必要があります。

SET /A ステートメントの簡略化
SET /A 計算で使用する場合、変数を展開する必要はありません。パーセントや感嘆符で囲まずに変数名をそのまま使用できます。この利便性は、SET /A でのみ機能します。

@echo off
setlocal enableDelayedExpansion
set /p usercommand= "Input:"
if "%usercommand%" equ "done" (

  set /p usertimeouthours= "Input Hours: "
  echo (!usertimeouthours!^)

  set /p usertimeoutminutes= "Input Minutes: "
  echo (!usertimeoutminutes!^)

  set /p usertimeoutseconds= "Input Seconds: "
  echo (!usertimeoutseconds!^)

  set /a answer= usertimeouthours*3600+usertimeoutminutes*60+usertimeoutseconds
  echo !answer!

  goto end
) else (
  echo finished
  goto user
)
:end
于 2012-08-09T04:29:22.340 に答える