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

问题描述:

我试图使用此代码等于一个特定的日期比较当前日期:为什么比较一个环境变量值和一个字符串导致错误信息?

@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”在这个时候出乎意料。

这个错误的原因是什么?

+2

Nichie,请更新[你最后一个问题(https://stackoverflow.com/q/46744276/6738015)你找到了解决办法,并且还将[上一个问题中要求的信息]发布到(https://stackoverflow.com/a/46743856/6738015)!成员往往不愿意向那些不遵守合理请求的人提供回复等。针对这个问题,您没有在比较的任何一方上匹配双引号,也不知道'%date%'的格式。变量! – Compo

+1

您在比较的一侧有引号以保护空格。为什么你认为你不需要他们在另一边? – Squashman

日期环境变量参考%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"被解释为意外操作符。

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

该双引号还通过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的日期字符串上成功,并且在这种情况下两个比较的字符串不相等。

在我的电脑为%DATE%扩展到根据在Windows 区域和语言设置配置不包含工作日的日期字符串IF条件是不正确的。

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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