如果声明疯狂

时间:2017-12-09 22:20:36

标签: batch-file if-statement

这是我用来运行Index.bat的脚本:

:parsefind
call Index.bat

显然,Index.bat变得疯狂并且一直忽略“if”并打开所有目录。我尝试在批处理文件中设置“tofind”而不是Index.bat,但它似乎没有改变任何东西。我也尝试删除“(”(没有修复)并且不得不放“_”因为它会弄乱“或”。我制作了更大的批处理文件,从来没有遇到过这个问题。我也注意到了“(”在Notepad ++语法中没有突出显示,出了什么问题?

    Set tofind=%cmd:~6%

    if "%tofind%"=="weapons_ability" or "weapons_abilities" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities"
    )
    if "%tofind%"=="weapons" or "weps" (
        start "" "%cd%\unpacked\items\active\weapons"
    )
    if "%tofind%"=="melee" or "melee_weapons" (
        start "" "%cd%\unpacked\items\active\weapons\melee"
    )
    if "%tofind%"=="ranged" or "ranged_weapons" (
        start "" "%cd%\unpacked\items\active\weapons\ranged"
    )
    if "%tofind%"=="axe_abilities" or "axe_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\axe"
    )
    if "%tofind%"=="broadsword_abilities" or "broadsword_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\broadsword"
    )
    if "%tofind%"=="generic_abilities" or "generic_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\generic"
    )
    if "%tofind%"=="hammer_abilities" or "hammer_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\hammer"
    )
    if "%tofind%"=="shortsword_abilities" or "shortsword_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\shortsword"
    )
    if "%tofind%"=="spear_abilities" or "spear_ability" (
        start "" "%cd%\unpacked\items\active\weapons\melee\abilities\spear"
    )
    if "%tofind%"=="staff" or "staffs" (
        start "" "%cd%\unpacked\items\active\weapons\staff"
    )
    if "%tofind%"=="staff_abilities" or "staff_ability" (
        start "" "%cd%\unpacked\items\active\weapons\staff\abilities"
    )
    if "%tofind%"=="staff_effectzone" or "staffs_effectzone" (
        start "" "%cd%\unpacked\items\active\weapons\staff\abilities\effectzone"
    )
    if "%tofind%"=="staff_controlprojectile" or "staffs_econtrolprojectile" (
        start "" "%cd%\unpacked\items\active\weapons\staff\abilities\controlprojectile"
    )
    if "%tofind%"=="staff_guidedbolt" or "staffs_guidedbolt" (
        start "" "%cd%\unpacked\items\active\weapons\staff\abilities\guidedbolt"
    )
    if "%tofind%"=="staff_tesla" or "teslastaff" (
        start "" "%cd%\unpacked\items\active\weapons\staff\testlastaff"
    )
    if "%tofind%"=="wand" or "wands" (
        start "" "%cd%\unpacked\items\active\weapons\wand"
    )
    if "%tofind%"=="whip" or "whips" (
        start "" "%cd%\unpacked\items\active\weapons\whip"
    )
    if "%tofind%"=="whip_ability" or "whip abilities" (
        start "" "%cd%\unpacked\items\active\weapons\whip\abilities"
    )
    goto find
)

2 个答案:

答案 0 :(得分:2)

如上所述,您的if语法不正确

FOR %%a IN (
"generic_abilities,generic_ability$%cd%\unpacked\items\active\weapons\melee\abilities\generic"
"hammer_abilities,hammer_ability$%cd%\unpacked\items\active\weapons\melee\abilities\hammer"
) DO FOR /f "tokens=1*delims=$" %%w IN (%%a) DO (
 FOR %%i IN (%%w) DO IF /i "%%i"=="%tofind%" ECHO START "" "%%x"
)

这是一种做同样容易维护的方法。

注释:
逗号分隔的选项字符串的数量没有实际限制 - 我使用了两个,但十个没有问题 for/f分割%%a上的字符串$,分配给%%w%%x
/i强制不区分大小写if 结果start命令仅仅echo用于测试。删除echo关键字以执行start

答案 1 :(得分:1)

这个答案只是向用户显示运行Windows批处理文件时OR不是IF命令的选项。

给出以下代码。

@Echo off
set /P "cmd=enter cmd:"
if "%CMD:~0,4%"=="menu" or "back" ( goto cmd )
echo after if
pause
GOTO :EOF

:cmd
echo In cmd function
pause
GOTO :EOF

我们现在将从cmd提示符运行批处理文件,第一次进入菜单,第二次进入。

C:\temp>so.bat
enter cmd:menu
'or' is not recognized as an internal or external command,
operable program or batch file.
after if
Press any key to continue . . .

C:\temp>so.bat
enter cmd:back
after if
Press any key to continue . . .

C:\temp>

正如您在输出中看到的,它不会执行CMD标签。 IF命令第一次与菜单输入匹配,然后输出OR命令不是命令的错误。第二次运行时,字符串比较不相等,因为back不等于菜单。