2011-07-21 41 views
1

可以先擁有所有我對我的英文不好:) 現在對不起我的問題返回到開始如果沒有輸入輸入(BAT文件)

我試圖創建一個腳本與多個文件選擇,我遇到了一個問題。 如果我沒有輸入輸入(只需按回車鍵),該文件將顯示錯誤並關閉。 現在我的問題是,是否有一個命令,將強制文件返回到開始在沒有輸入輸入的情況下?

我的腳本

: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」上的所有「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」。我喜歡這一點,因爲你不需要按回車afterwards- 節省時間,如果你有很多選擇

現在,錯誤級別是分配你的輸入...所以小心!

我的選擇可能是「CHOICE/C 3689> nul」,但錯誤級別輸出仍然是輸入3時的errorlevel = 1,輸入6時errorlevel = 2,依此類推。

所以,如果你有一個選項,按0返回到主菜單,和選擇/ C 0123按零將錯誤級別= 1,按1將錯誤級別= 2 ...等

選擇是超級有用的,只要去鍵入選擇/?更多細節。