簡體   English   中英

批處理文件循環問題

[英]Batch file loop issues

我的批處理文件中存在循環問題。 使用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語句的“Else”部分中,當用戶選擇選項2或“n”時,它將忽略它並移動到它之后的任何代碼。 在這種情況下,它循環回到此代碼段的開頭。 但是在循環之后,它現在接受用戶輸入並正確跳轉到“結束”標簽。

在玩完之后我發現刪除這個段周圍的標簽可以修復它,但是如果用戶發出錯誤就會這樣做,它就不會循環回來並重新提問。 最初我的“Else”聲明看起來像這樣:

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
)

因此理想情況下循環相同的問題,但顯然發生了同樣的問題。 我試圖尋找答案,但很難找到這樣一個特定的編碼問題。 任何幫助,將不勝感激。

將標簽放在括號內的代碼塊中是不好的做法 如果goto label並且該標簽位於代碼塊內,則執行的線程會落在標簽上,認為它不再位於代碼塊內,並且會出現問題。 您應該重新編寫腳本流程的邏輯。 將標簽移到任何括號之外,當你想調用一個函數然后返回繼續解析下一行時,考慮使用call而不是goto 您甚至可能會發現從函數中不時返回值很有用。 另外,使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM