【问题标题】:If statement goes Crazy如果声明变得疯狂
【发布时间】:2017-12-09 22:20:36
【问题描述】:

这是我用来运行 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
)

【问题讨论】:

  • 批处理文件中没有 OR 这样的东西。
  • @DarkMesa 你读过or会很有趣。在命令提示符窗口中执行if /? 时显示的帮助不包含有关or 运算符的任何信息。 IF documentation in MS command line reference 没有提到运营商 or。并且SS64 documentation for IF command 也不包含有关or 运算符的信息。因此,为什么您认为 IF 应该在条件下支持 or 运算符会非常有趣。
  • @DarkMesa 不,您从未在 Windows 批处理文件中成功使用过 OR。
  • 这里有两点: 1. Batch 文件中if 命令中没有or 运算符。 2. 在支持or 运算符的语言中,您需要重复比较,因为“或”本身不是比较:if "%CMD:~0,4%"=="menu" or "%CMD:~0,4%"=="back" ( goto cmd )

标签: batch-file if-statement


【解决方案1】:

如上所述,您的 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 命令仅用于测试echoed。去掉echo关键字来执行start

【讨论】:

    【解决方案2】:

    这个答案只是为了向用户表明OR 不是在运行 Windows 批处理文件时使用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命令第一次匹配menu的输入,然后输出OR命令不是命令的错误。第二次运行字符串比较不相等,因为返回不等于菜单。

    【讨论】:

    • 事实证明,“或”语句适用于我的批处理文件之一,但不适用于新文件。我不知道为什么会这样。我尝试使用它一次,当我发现它有效时,我在其他批处理文件中使用它,我不记得它失败了。
    • @DarkMesa,当您找到适用于 IFOR 的批处理文件时告诉我。我当然很想看看。
    • 我确实有一个可以工作的。我无法解释如何,但确实如此,我不是要证明一个死点或任何东西。
    • 我尝试将它添加到一个新的批处理文件中,不,它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2015-03-25
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多