For / F保持exe的errorlevel输出

时间:2016-10-28 18:08:29

标签: for-loop batch-processing

您好我构建了一个这样的菜单

Select a mod from list below or select an option[1-4]:

[ 1 ] [Start Uncooking]
[ 2 ] [Browse computer for cooked mod]
[ 3 ] [Change cooked mods list folder]
[ 4 ] [Exit]

Cooked mods list folder:
D:\Spiele\The Witcher 3 Wild Hunt GOTY\Mods\:

"all folders of the above folder in one line like":
Mod1
Mod2
etc.

我正常地使用它:

call %wselectEXE% %menuTXT% "Quick Mod Tool Uncook Menu" "set userinput=%listfolder%$item" "Uncook Menu" /menu /oemlist /oemout /margin /cmdCenter /grid /fs=12 /dx=485 /dy=180  > %userinputBAT% 
if %errorlevel%==0 del %menuTXT% & del %userselectionBAT% & del %userselectionlistBAT% & cls & goto :QuickModToolsMenu
if %errorlevel%==1 goto :UncookMenu
if %errorlevel%==2 goto :UncookMenu
if %errorlevel%==3 del %menuTXT% & goto :UncookAction
if %errorlevel%==4 goto :BrowseForModunCookMenu
if %errorlevel%==5 goto :ChangeListFolder
if %errorlevel%==6 del %menuTXT% & del %userselectionBAT% & del %userselectionlistBAT% & cls & goto :QuickModToolsMenu
if %errorlevel%==7 goto :UncookMenu
if %errorlevel%==8 goto :UncookMenu
if %errorlevel%==9 goto :UncookMenu
if %errorlevel%==10 (goto :UncookMenu) else goto :UncookMenuSub

现在我用for循环替换它但是我错过了wselect.exe的错误级别。

我为此得到了一个解决方法:

for /f "usebackq delims=" %%a in (`"wselect.exe Menu.txt "Quick Mod Tool Uncook Menu" "$item" "Uncook Menu" /menu /fs=12 /dx=485 /dy=180 /oemlist /oemout /margin /cmdCenter /grid"`) do (set "modname=%%a") & set "userinput=%listfolder%%%a"
if "%userinput%" == "%listfolder%" del %menuTXT% & del %userselectionBAT% & del %userselectionlistBAT% & cls & goto :QuickModToolsMenu
if "%userinput%" == "%listfolder%Select a mod from list below or select an option[1-4]:" goto :UncookMenu
if "%userinput%" == "%listfolder%[ 1 ] [Start Uncooking]" del %menuTXT% & goto :UncookAction
if "%userinput%" == "%listfolder%[ 2 ] [Browse computer for cooked mod]" goto :BrowseForModunCookMenu
if "%userinput%" == "%listfolder%[ 3 ] [Change cooked mods list folder]" goto :ChangeListFolder
if "%userinput%" == "%listfolder%[ 4 ] [Exit]" del %menuTXT% & del %userselectionBAT% & del %userselectionlistBAT% & cls & goto :QuickModToolsMenu
if "%userinput%" == "%listfolder%Cooked mods list folder:" goto :UncookMenu
if "%userinput%" == "%listfolder%%listfolder%:" goto :UncookMenu
goto :UncookMenuSub

有没有办法回到orignal%errorlevel%输出?

请记住goto_%errorlevel%不是这里的一个选项,因为如果我这样构建我将不得不定义255个跳转标签(wselect.exe中最多255个错误级别)

但是我只需要8%的errorlevel%来处理,因为其他所有人都应该跳转到同一个程序。

基本上我需要为Menu.txt的第一行设置跳转标记(空白行被忽略)

对于所有其他行,我需要相同的跳转标记。

仅供参考我的剧本按预期工作,但我喜欢错误并讨厌我自己的解决方案:D

1 个答案:

答案 0 :(得分:0)

使用for循环你自己太难了,wselect提供的例子给出了一个在循环中使用菜单的好例子。

wselect.exe设置了errorlevel本身,无需创建或执行批处理文件。如果您的menu.txt包含以下内容,则最简单的形式如下所示。

Menuitem1   
Menuitem2
Quit

在同一个文件夹中

@echo off
setLocal EnableDelayedExpansion
:menu
wselect.exe menu.txt "My menu title" 
set line=0
for /f "delims=" %%l in (menu.txt) do (
    set /a line+=1
    if !line!==%errorlevel% (
      set item=%%l
    ) 
)

goto item%errorlevel%

:item1
echo selected %item% with errorlevel %errorlevel%
goto menu
:item2
echo selected %item% with errorlevel %errorlevel%
goto menu
:item3
goto quit

:quit

你的for循环不能用于获取errorlevel,因为只有在命令执行后才知道errorlevel,并且整个for循环被认为是一个命令,所以你只能获得前一次调用的errorlevel。 相反,我枚举菜单文件以在number = errorlevel

的行中查找文本