为什么比较环境变量值和字符串会导致错误消息?

时间:2017-10-14 18:47:09

标签: batch-file cmd

我尝试使用此代码比较当前日期等于特定日期:

@echo on
if %date%=="Sun 10/15/2017" ( echo "Today is Sunday" ) else ( echo "Today is Unknown" )
pause

但是在执行批处理文件时,我只输出错误消息:

  

10/15/2017 ==“Sun 10/15/2017”此时出人意料。

出现此错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

日期环境变量引用%date%在预处理状态期间由区域(国家/地区)依赖字符串替换为Windows命令解释程序 IF 命令完全执行。

在命令提示符窗口中运行批处理文件时,可以看到 IF 命令行是在预处理之后:

if Sun 10/15/2017=="Sun 10/15/2017" ( echo "Today is Sunday" ) else ( echo "Today is Unknown" )

因此,环境变量扩展后 IF 命令的语法不正确,因为Sun作为第一个参数,空格和Sun 10/15/2017=="Sun 10/15/2017"被解释为意外操作符。< / p>

每当比较字符串时,建议在双引号字符串中使用双引号,空格字符不会被解释为参数分隔符。字符&()[]{}^=;!'+,`~|<>也被解释为双引号字符串中的文字字符。

在运行字符串比较时,双引号也会通过 IF 进行比较。因此需要将两个比较的字符串括在双引号中。

@echo off
if "%DATE%"=="Sun 10/15/2017" ( echo "Today is Sunday." ) else ( echo "Today is unknown." )
pause

如果区域相关日期确实包含缩写的工作日,则另一种解决方案。

@echo off
if not "%DATE:Sun=%"=="%DATE%" ( echo "Today is Sunday." ) else ( echo "Today is unknown." )
pause

此批处理文件将当前日期字符串与所有不区分大小写的Sun出现的事件进行比较,并将其替换为未修改的当前日期字符串。字符串替换仅在包含工作日缩写Sun的日期字符串上成功,在这种情况下,两个比较的字符串不相等。

在我的计算机上, IF 条件永远不会,因为%DATE%根据Windows 区域和语言设置中的配置扩展为不包含工作日的日期字符串。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • if /?
  • set /?