簡體   English   中英

批處理:轉到部分無法正常工作

[英]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.batmodPackChoice提示

我很困惑為什么會發生這種情況,特別是因為它本身就可以正常工作。 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.

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