2017-02-01 3 views
-2

バッチスクリプトを作成するときには常にこの問題があります。スクリプトに変数の設定を促すメッセージが表示されたら、セミコロン(これは一例)が入力されるとスクリプトが終了します。それを防ぐ方法はありますか?無効な文字入力時にバッチスクリプトが終了しないようにする

例:私はそのスクリプトを実行している見るもの

@echo off 
:1 
cls 
echo Please enter your ID: 
set /P id= 
if /i %id%==119 goto Tom 
if /i %id%==204 goto Brittany 
if /i %id%==12 goto Shannon 
if /i %id%==64 goto Jack 
goto 1 

:Tom 
cls 
echo Tom, you have to mow the lawn. 
pause>nul 
exit 

:Brittany 
cls 
echo Brittany, you have to fold the laundry. 
pause>nul 
exit 

:Shannon 
cls 
echo Shannon, you have to feed the dog. 
pause>nul 
exit 

:Jack 
cls 
echo Jack, you have to replace the radio's capacitors. 
pause>nul 
exit 

C:\>myscript.bat 
Please enter your ID: 
asjfash;dfjlas;ldf 
asjfash;dfjlas;ldf==i was unexpected at this time. 

、スクリプトが終了します。

ありがとうございます!

+4

コマンドのstd.inputにファイルの内容をしてくださいリダイレクト[編集]あなたの質問および作成する方法をフォロー、自分の失敗コードを共有[ mcve]。 – JosefZ

+0

私はお詫び申し上げます、JosefZ、私はここでもまだ新しいです。 – ditheredtransparency

+0

_result_が適切であることを示していますが、十分ではありません。失敗した_code_も表示してください。 [構文:エスケープ文字、デリミタおよび引用](http://ss64.com/nt/syntax-esc.html)を読んでください。間違いなく、セミコロン(s)をエスケープする必要があります。'if/i"%varname% "==" literal; string "call:labelE' – JosefZ

答えて

0

読む構文:Escape Characters, Delimiters and Quotes

区切り文字

区切り文字は次から一つのパラメータを分離 - 彼らは言葉に コマンドラインアップを分割します。

パラメータは、ほとんどの場合、スペースで区切られていますが、以下の のいずれも有効な区切り文字です:

  • カンマ(,
  • セミコロン(;
  • 等号(=
  • スペース(
  • タブ(   

ユーザーがリストされたセパレータ、上記のいずれか含むいくつかの文字列を入力した場合(のようなset "id=1 19"を、その後%id%にスペースが含まれている)、そして if /i 1 19==119 goto Tom ↑ this space causes error 19==119 was unexpected at this time

if /i %id%==119 goto Tom 

結果は間違いなく、あなたがする必要がありますエスケープ区切り文字および他のすべての文字は次のとおりです。

@echo off 
:1 
cls 
echo Please enter your ID: 
set /P id= 
if /i "%id%"=="119" goto Tom 
if /i "%id%"=="204" goto Brittany 
if /i "%id%"=="12" goto Shannon 
if /i "%id%"=="64" goto Jack 
goto 1 

rem script continues here 

FYI、Redirection articleリストバッチスクリプトでのエスケープ出現のようにエスケープする必要がある他のcmd -poisonousの文字は、次のいの意味:

  • からシングルアンパサンド:コマンドの区切りとして使用
  • &&からダブルアンパサンド:(if errorlevel 0ような)条件付きコマンドセパレータ
  • ||からダブルパイプ(垂直線):条件付きコマンドセパレータ(if errorlevel 1等)
  • からシングルパイプは別
  • のstd.inputに一つのコマンドのstd.outputをリダイレクト - シングルより大きい:デバイス
  • >>のようなファイルまたはファイルへの出力をリダイレクトする -よりダブル大:出力は、ファイルの最後に追加されます
  • から未満
+0

これを手伝ってくれてありがとう!だから、引用符を使うと、それは私が入力したものだけに行きますか? – ditheredtransparency

+0

はい、そうです。しかし、%Gのために '%2 'を試してみてください(%1)複数のユーザの入力。バッチスクリプトでは、ループ変数 '%G'と'%g 'は '%2'の中の%% gに対して(" 1 <2,64; 119 ")do% G)echo "%% g" 'を実行します。 – JosefZ

+0

申し訳ありませんが、私はかなり理解していません – ditheredtransparency

関連する問題