コマンドプロンプトウィンドウを開き、set /?
を実行し、すべてのヘルプページをコンソールウィンドウに出力します。
オプション/A
は算術式用であり、環境変数に文字列値を割り当てることは決してしないでください。環境変数は常にstring型です。ライン上
set /a partner=Ignite
Windowsコマンド・プロセッサは、整数値に変換文字列の値が変数partner
に割り当てなければならない環境変数の名前としてIgnite
解釈は、文字列の整数から戻って変換されます。変数Ignite
がない可能性が最も高いため、値0は文字列としてpartner
に割り当てられます。行で
set /a move3=Flame Spread
Windowsコマンド・プロセッサは、環境変数の名前としてFlame
とSpread
を解釈します。しかし、演算子の間に演算子がないため、演算子がないため演算式が無効です。
ソリューション:
@echo off
setlocal EnableDelayedExpansion
set "confirm=n"
set /P "confirm=y/n : "
if /I "!confirm!" == "y" (
set "partner=Ignite"
set "monsterlevel=5"
set "reqexp=100"
set "currentexp=0"
set "element=Fire"
set "evolution=Igneous"
set "move1=Scratch"
set "move2=Burn"
set "move3=Flame Spread"
set "move4=Quick Slash"
set "hp=100"
goto mymonster
)
if /I "!confirm!" == "n" goto pick
rem The user has entered whether y/Y nor n/N. What to do now?
confirm
変数環境がバッチユーザーの場合のデフォルト値はちょうどRETURNまたはは全く何も入力せずにをENTER当たると定義されています。この場合、環境変数confirm
は現在の値を保持するか、前に定義されていない場合は未定義です。
IFオプション/I
のため、文字列比較が大文字と小文字を区別しません。このコマンドのヘルプについては、コマンドプロンプトウィンドウif /?
で実行してください。
遅延比較を使用して文字列の比較が行われます。これは、バッチユーザーが誤ってまたは意図的にたとえば"<
のように入力し、遅延拡張を使用せずに文字列比較を行うことができるため、セキュリティのためです。構文エラーが原因でバッチ処理が最初にIFの条件行ですぐに終了します。
文字列を比較するときは、必ず一重引用符ではなく二重引用符を使用してください。二重引用符は、IFの条件を評価する際にWindowsコマンドプロセッサに特別な意味を持ちますが、一重引用符はありません。文字'
は、文字または数字のような==
との文字列比較で解釈されますが、特別な意味はありません。しかし、Windowsコマンドプロセッサーは、==
の左右の文字列を二重引用符で囲んで比較しています。double quotes内の文字列は比較されませんが、二重引用符がある文字列はif /I "!confirm!" == y
を意味しません。
回答も参照してくださいHow to set environment variables with spaces?
なぜ「/ a」を使用しますか? 'set/a partner = Ignite'は'%partner% 'を'%Ignite% 'の値に設定します。これは空です。 'set/a move3 = Flame Spread'は'%move3% 'を'%flame%[missing operator here]%Spread% 'に設定しようとします。 – Stephan
算術演算には '/ a'はありませんか? '/ a'を残しておけば、問題を解決できるかどうか? 'set /?'は、引数が大文字と小文字を区別しない数値でなければならないことを示します。 – geisterfurz007
「行方不明者」という意味はどうですか?それはエラーメッセージですか? –