2015-03-02 185 views
0

我在我的批處理文件中存在循環問題。當使用set命令時,我給了用戶兩個選擇。第一個選項正常工作,但第二個選項被忽略,除非循環函數完成重新提出問題。然後它接受第二個選項的輸入。批處理文件循環問題

:WithAccess 
cls 
If not exist "C:\Program Files (x86)\Microsoft Office\Office15\Winword.exe" (
    goto UninstallViewers 
    :WithAccess2 
    echo Installing MS Office 2013 x32 With Access... 
    start /wait "" "MS Office 2013 x32 Installers\MSOfficeWithAccess" 
    echo Installation Complete. 
) Else (
    echo Microsoft Office 2013 might already be installed. 
    set /p op4=Do you want to run installer anyway? [Y/N]: 
    If "%op4%"=="y" goto WithAccess2 
    If "%op4%"=="n" goto end 
    echo That's not a valid option. 
    goto WithAccess 
) 

所以,在這個if語句的「其他」部分,當用戶選擇選項2或「n」,它會忽略這一點,並移動到任何代碼之後。在這種情況下,它會循環回到此代碼段的開頭。但是在循環之後,它現在接受用戶輸入並正確跳轉到「結束」標籤。

玩過之後,我發現刪除圍繞此段的標籤可以修復它,但是如果用戶發生錯誤,它將不會返回並重新提出問題。本來我的「其他」的語句是這樣的:

Else (
    echo Microsoft Office 2013 might already be installed. 
    :Loop2 
    set /p op4=Do you want to run installer anyway? [Y/N]: 
    If "%op4%"=="y" goto WithAccess2 
    If "%op4%"=="n" goto end 
    echo That's not a valid option. 
    goto Loop2 
) 

因此,這將非常循環同樣的問題,但顯然它發生同樣的問題。我試過四處尋找答案,但很難找到這樣一個特定的編碼問題。任何幫助,將不勝感激。

回答

0

這是bad practice將標籤放在括號的代碼塊中。如果你使用goto label並且該標籤位於代碼塊內,則執行線程會落在標籤上,因爲它不再位於代碼塊內,並且會出現問題。您應該重新處理腳本流程的邏輯。將標籤移到任何括號外,並且考慮在調用函數時使用call而不是goto,然後返回以繼續解析下一行。您甚至可能會偶爾發現它對return values from your functions有用。此外,使用if /i進行不區分大小寫的測試。

:WithAccess 
cls 
If not exist "C:\Program Files (x86)\Microsoft Office\Office15\Winword.exe" (
    call :UninstallViewers 
) Else (
    echo Microsoft Office 2013 might already be installed. 
    set /p "op4=Do you want to run installer anyway? [Y/N]: " 
    setlocal enabledelayedexpansion 
    If /I "!op4!"=="y" goto WithAccess2 
    If /I "!op4!"=="n" goto :EOF 
    endlocal 
    echo That's not a valid option. 
    goto WithAccess 
) 

:WithAccess2 
echo Installing MS Office 2013 x32 With Access... 
start /wait "" "MS Office 2013 x32 Installers\MSOfficeWithAccess" 
echo Installation Complete. 

:: end main runtime 
goto :EOF 

:UninstallViewers 
:: (or whatever code you have to do the uninstalling) 
wmic product where "name like '%%viewer%%' and vendor like '%%microsoft%%'" call uninstall 
goto :EOF 
+1

也許我錯過了一些東西,但'%op4%'?發佈後,代碼需要延遲擴展。 – 2015-03-03 06:53:39

+0

你不會錯過任何事情。現在修復它。謝謝! – rojo 2015-03-03 16:20:44