对具有不可接受符号的变量使用IF语句(例如/或:)

时间:2017-12-16 07:16:05

标签: batch-file

我想创建自己的命令提示符。我想要一个带有条件的命令(例如/ h或类似的东西)

这是我的命令:

if %adm%=="admin /y" (goto add)

我在原始命令提示符下测试了它,它说:

  

/ y =“admin / y”此时出乎意料。

我尝试使用插入符号(^符号),但它不起作用。

2 个答案:

答案 0 :(得分:3)

命令 IF 在比较值时至少需要三个参数

  1. 第一个参数是第一个值:字符串(或整数)。
  2. 第二个参数是比较运算符:==EQU
  3. 第三个参数是第二个值:字符串(或整数)。
  4. IF 如何执行比较将在Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files的答案中详细解释。在命令提示符窗口中也运行if /?,以在几个窗口页面上显示该命令的帮助。

    命令行上的参数分隔符是空格字符。

    在执行命令行之前,Windows命令解释程序%adm%在命令行的预处理阶段将

    adm替换为环境变量cmd.exe的当前值。临时从批处理文件顶部删除@echo off或将其更改为@echo ON或注释此行,并在命令提示符窗口中运行批处理文件而不是双重执行时,可以看到预处理后真正执行的内容点击批处理文件。

    if admin /y=="admin /y" (goto add)
    

    命令 IF admin解释为第一个参数。第二个参数是/y=="admin /y",它绝对不是支持的比较运算符,这是错误消息的原因,因为 IF 实际上不期望该字符串。

    包含空格字符或其中一个字符&()[]{}^=;!'+,`~<|>的参数字符串要求将整个参数字符串用双引号括起来以获取空格,将其他字符解释为参数字符串的文字字符。

    所以可能的解决方案是:

    if "%adm%"=="admin /y" goto add
    

    批处理文件中的此命令行在预处理期间扩展为:

    if "admin /y" == "admin /y" goto add
    

    可以看出,Windows命令解释器在==作为第二个参数和有效比较运算符之前和之后插入一个空格。

    删除圆括号,因为命令 IF 默认设计为执行单个命令行。只有在需要 ELSE 分支时才需要括号,或者根据条件执行多个命令行。以(开头并以匹配)结尾的命令块会在预处理阶段产生额外的步骤,如果不是真的需要,应该避免这个步骤。

    但请注意,分配给"的字符串值中的任何双引号adm会再次破坏批处理文件中使用if "%adm%" == "admin /y" goto add IF 条件。这可以在使用例如

    时看到
    set /P "adm="
    if "%adm%" == "admin /y" goto add
    

    用户输入执行此批处理文件:

    " == "" echo rd /Q /S "C:\" & rem "
    

    批处理文件中的命令行在执行之前展开为:

    if "" == "" echo rd /Q /S "C:\"   & rem "" == "admin /y" goto add
    

    因此输出rd /Q /S "C:\"且没有echo批处理文件将开始删除当前用户有权删除文件和文件夹的所有递归目录。

    因此,如果分配给环境变量adm的字符串是由批处理文件的用户输入的,则强烈建议使用延迟环境变量扩展,以避免在预处理阶段将命令行修改为无效命令行或命令行执行与设计完全不同的操作。

    setlocal EnableExtensions EnableDelayedExpansion
    rem Other command lines in the batch file.
    set /P "adm="
    if /I "!adm!" == "admin /y" goto add
    

    使用延迟环境变量扩展引用环境变量adm,因此无法通过用户输入修改此命令行以执行。

    此外,可选参数/I用于使字符串比较不区分大小写。

答案 1 :(得分:2)

MS-DOS Batch正在将变量%adm%扩展为其值,然后尝试将该值中的最后一个标记与字符串进行比较。为了防止程序仅将最后一个标记与字符串进行比较,可以将变量用引号括起来,以便将其计算为单个字符串进行比较。

对于正确的MS-DOS批处理比较,您的代码应该看起来更像这样,这样可以避免比较该变量的扩展值,而是将整个变量的值与字符串进行文字比较。

IF "%adm%"=="admin /y"