[英]Batch: goto sections not working correctly
我有一個批處理文件沒有按照我想要的方式正確使用 goto 命令。 這是批處理本身(一些注釋和額外的 echo 命令被刪掉以使其更適合這里)。 我稱之為“ compile.bat
”。
@echo off
set "consoleChoice=%~1"
goto consoleChoiceCheck
REM console not selected, main compiler prompt not used, pick console
:consoleChoicePrompt
CHOICE /C 12345 /M "Which console are you using? "
IF ERRORLEVEL 5 SET consoleChoice=XB & goto section2
IF ERRORLEVEL 4 SET consoleChoice=PSP & goto section2
IF ERRORLEVEL 3 SET consoleChoice=PS2 & goto section2
IF ERRORLEVEL 2 SET consoleChoice=GC & goto section2
IF ERRORLEVEL 1 SET consoleChoice=PC & goto modPackSection
REM Checks if console was selected from main compiler script/if main compiler script was used
:consoleChoiceCheck
if "%consoleChoice%"=="" goto consoleChoicePrompt
:modPackSection
REM get mod pack choice from main compiler script
set "modPackChoice=%~2"
goto modPackChoiceCheck
REM mod pack not selected, main compiler prompt not used, pick mod pack
:modPackChoicePrompt
CHOICE /C 1234 /M "Which Mod Pack are you using? "
IF ERRORLEVEL 4 SET modPackChoice=MUE & goto section2
IF ERRORLEVEL 3 SET modPackChoice=BHE & goto section2
IF ERRORLEVEL 2 SET modPackChoice=AXE & goto section2
IF ERRORLEVEL 1 SET modPackChoice=X2UP & goto section2
REM Checks if mod pack was selected from main compiler script/if main compiler script was used
:modPackChoiceCheck
if "%modPackChoice%"=="" goto modPackChoicePrompt
:section2
...
這是調用此批處理文件的相關代碼。 我稱之為“ globalCompile.bat
”
CHOICE /C 12345 /M "Which console are you using? "
IF ERRORLEVEL 5 SET consoleChoice=XB & goto :skinPackSection
IF ERRORLEVEL 4 SET consoleChoice=PSP & goto :skinPackSection
IF ERRORLEVEL 3 SET consoleChoice=PS2 & goto :skinPackSection
IF ERRORLEVEL 2 SET consoleChoice=GC & goto :skinPackSection
IF ERRORLEVEL 1 SET consoleChoice=PC & goto :modPackSection
CHOICE /C 1234 /M "Which Mod Pack are you using? "
IF ERRORLEVEL 4 SET modPackChoice=MUE & goto skinPackSection
IF ERRORLEVEL 3 SET modPackChoice=BHE & goto skinPackSection
IF ERRORLEVEL 2 SET modPackChoice=AXE & goto skinPackSection
IF ERRORLEVEL 1 SET modPackChoice=X2UP & goto skinPackSection
...
if %consoleChoice%==PC (
call compile.bat %consoleChoice% %modPackChoice%
) else (
call compile.bat %consoleChoice%
)
如您所見, compile.bat
設置為通過從globalCompile.bat
調用來運行,但它也可以獨立運行。 這是問題:
compile.bat
在自己調用時正確運行。 如果您為consoleChoice
選擇 PC,它將彈出modPackChoice
的提示。 如果您為 consoleChoice 選擇任何其他內容,它將跳過該提示。globalCompile.bat
globalCompile.bat
正確運行。 它將要求modPackChoice
,然后運行並調用所有相應的批處理文件。globalCompile.bat
選擇了非 PC 選項,則consoleChoice
compile.bat
的執行。 每當我將內容輸入globalCompile.bat
時, modPackChoice
提示都不會出現,但是一旦它開始調用其他批處理文件並進入compile.bat
,它將拉出compile.bat
的modPackChoice
提示我很困惑為什么會發生這種情況,特別是因為它本身就可以正常工作。 在globalCompile.bat
調用的所有批處理文件中, compile.bat
是唯一一個像這樣有條件地使用變量的文件。 我認為如果選擇了 PC 選項,則設置一個 if 語句僅使用modPackChoice
變量作為compile.bat
的輸入,但正如您所見,這不起作用。 真的,我覺得沒有它應該可以工作,因為goto section2
命令應該完全跳過:modPackSection
。 誰能幫助解釋為什么這可能僅在單獨調用時才起作用?
如果global
調用使用非 PC 選擇進行compile
,則它僅使用第一個參數提供compile
。
因此, compile
將識別%~1
,忽略:consoleChoiceCheck
中的goto
,因為consoleChoice
不為空,然后繼續:modPackSection
modPackChoice
將設置為空,因為未提供%2
,因此:modPackChoiceCheck
將執行goto modPackChoicePrompt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.