2011-07-21 6 views
1

[OK]を最初に私は複数でスクリプトファイルを作成しようとしている私の問題戻る何も入力が入力されていない場合は開始する(BATファイル)

のために今、私は私の下手な英語のため申し訳ありませんが、すべて:) を持っています私は問題に遭遇しました。 入力を入力しないで(単にEnterを押す)、ファイルはエラーを表示してシャットダウンします。 私の質問は、入力がない場合にファイルを[開始]に戻すように強制するコマンドがあるかどうかです。あなたが見ることができるように

私のスクリプト

:input 
@echo off 
CLS 
ECHO ############################################# 
ECHO #           # 
ECHO # 1 - Make A System Folder or File   # 
ECHO # 2 - Restore Folder or File    # 
Echo # 3 - Exit         # 
ECHO #           # 
ECHO ############################################# 

SET /P O=Set Your Choice And Press Enter: 
ECHO Loading ......... 
(
IF %O%==1 GOTO Hide 
IF %O%==2 GOTO Show 
IF %O%==3 GOTO Exit 
IF %O%=="" GOTO input 
) 
ELSE (
    GOTO input 
) 

のこの関連部分は、私が「エルス」を使用しようとしたが、それは部分的にしか機能します。 与えられたリスト(私のケース1,2,3)に含まれていない変数を入力すると、ファイルは先頭に戻ってきます。そして、後で非入力要求を送信しても、ファイルは正しく動作し続けます。 問題は非常に具体的です。最初の入力が非入力の場合にのみ問題が発生します。スクリプトが

正常に動作し、他の状況で はありがとうと再び私は

答えて

1
  1. 入力する前に必ず変数をリセットしてください。ユーザーが単に変数を入力しても、自動的にはリセットされません。

    :: Delete variable %O% 
    SET "O=" 
    SET /P "O=Set Your Choice And Press Enter: " 
    
  2. 必ず(IFに)引用符で

    IF "%O%"=="1" GOTO Hide 
    IF "%O%"=="2" GOTO Show 
    IF "%O%"=="3" GOTO Exit 
    
  3. GOTO Labelを変数を取る(例外 - いくつかのクレイジーな例でgoto :label)戻ることはありません。あなたのケースでは、あなたが書くことができます。

    IF "%O%"=="1" GOTO Hide 
    IF "%O%"=="2" GOTO Show 
    IF "%O%"=="3" GOTO Exit 
    
    GOTO INPUT 
    
  4. コードを変更した後、狂った構文解析を防ぐために、各「手順」コマンドexit /B後に追加します。警告:gotoコマンドはC++でvoidのように動作しないため、コマンドexit /Bはスクリプトを停止します。しかし、call :labelコマンドexit /Bを使用している場合、コードは:labelの下でのみ停止します。

+0

+1実際に問題を解決するには、私はあなたの答えのいくつかの部分に賛成できないかもしれませんが(いくつかのクレイジーなケースでは "goto:label"のように - それはどういう意味ですか?また、 'exit/b'のように置くことは絶対に冗長です(あなたはなぜそこに置くのか説明しません)。 –

+0

私がバッチファイルで地雷探査を開始したとき、私は私が説明したようないくつかのバグにぶつかりました。私が "goto label"のバグをすべて消してしまった。非常に奇妙な。 –

+0

コマンド "exit/b"について - これはコードを変更する際の次の解析を防ぐために 'exit/b'(またはgoto:eof)を書くのに適したスタイルです –

2

括弧は必要ありません、私の下手な英語:)のために非常に残念です。お試しください、

:input 
@echo off 
CLS 
ECHO ############################################# 
ECHO #           # 
ECHO # 1 - Make A System Folder or File   # 
ECHO # 2 - Restore Folder or File    # 
Echo # 3 - Exit         # 
ECHO #           # 
ECHO ############################################# 

SET /P O=Set Your Choice And Press Enter: 
ECHO Loading ......... 
IF %O%==1 GOTO Hide 
IF %O%==2 GOTO Show 
IF %O%==3 GOTO Exit 
IF %O%=="" GOTO input 

ELSE 
GOTO input 

あなたの英語は非常に良いです!

0

うん、あなたがに行きたい場合:開始または:無入力の場合は何も、解決策は次のように記述 です:

この最初の行は、キー

です
set num="" 

set /P num=%input% 

if %num%==1 goto Choice1 
if %num%==2 goto Choice2 

if "%num%"=="" goto Start 

goto Start 

この最後の行は、(この例では、3は無効になりますと

再びスタートに行く選択肢 のあなたの範囲外の入力のためであります

もっと良い解決策があります。ただ選択肢を使用し、

これは、複数の選択肢のメニューに単に「より専門的な」解決策であり、それは本当に便利です...

代わりの%入力%とすべてのことジャズを設定します!範囲外の値を入力すると(123は1または2または3を選択できます)、無効な入力を意味する「ビープ音」が表示されます。

set errorlevel= 

CHOICE /C 123 >nul 
if %errorlevel%==1 goto Choice1 
if %errorlevel%==2 goto Choice2 
if %errorlevel%==3 goto Choice3 

これだけです!とても簡単ですよね?したがって、行の意味を説明するだけです...

最初の行では、errorlevelを空白に設定しています。これは、高度な状況になると、errorlevelに予期せず値が割り当てられるためです。だから後で自分自身を頭痛から守って消してください。

> nulは、それが選択であるという事実を「隠す」。ちょうどその上にエコーメッセージを置いて "選択肢Xを選択Xに押してください"と言ってください。あなたは選択肢

の多くを持っている場合今、ERRORLEVELはそう用心...あなたの入力を割り当てられないで時間を節約afterwards- を入力押す必要はありませんので、私はこれが大好き!

選択肢は「CHOICE/C 3689> nul」ですが、errorlevelの出力は3を入力するとerrorlevel = 1、6を入力するとerrorlevel = 2となります。

あなたは0を押して、メインメニューに戻りますオプション、およびCHOICE/C 0123になります1を押​​すと、= 1エラーレベルになりますゼロを押すを持っているので、場合ERRORLEVEL = 2 ...など

選択肢は非常に便利です、ちょうど行くとタイプ選択/?詳細については。

関連する問題