批处理校验DD-MM-YYYY日期格式时变量及if判断失效问题
批处理日期校验脚本变量失效、if判断不触发问题修复
问题场景
编写批处理脚本实现用户输入日期的DD-MM-YYYY格式校验时出现异常:echo命令可正常打印部分变量值,但变量后续赋值、拼接逻辑未按预期运行,if条件判断完全不触发,无法定位问题根源。
原始问题代码
@echo off cls :A echo. set /p date=Quelle date souhaitez vous enregistrer (JJ-MM-AAAA) ? for /f "tokens=1,2,3 delims=-" %%a in ("%date%") do ( set day=%%a set month=%%b set year=%%c ) echo %day% set date1 = %day% echo %date1% echo %month% echo %year% echo %date% if "%date%" == %day%-%month%-%year%(echo yes) else (echo no) goto :A
异常执行输出
Quelle date souhaitez vous enregistrer (JJ-MM-AAAA) ?09-09-09999 09 Commande ECHO désactivée. 09 0999 09-09-0999 Quelle date souhaitez vous enregistrer (JJ-MM-AAAA) ?
从输出可以看到:date1变量为空,if判断逻辑完全未执行,日期分段拼接结果未按预期生效。
根因分析
所有异常都来自批处理脚本的基础语法规则不匹配,具体问题点如下:
set赋值语法错误:批处理中set命令的等号两侧绝对不能加空格,否则会把空格识别为变量名/值的一部分。原代码set date1 = %day%实际创建了一个名为date1(末尾带空格)的变量,后续调用%date1%(无末尾空格)时自然取到空值,空值调用echo就会输出「ECHO命令已关闭」的系统提示。- 变量赋值带多余尾空格:原代码
set month=%%b行尾多了一个空格,会导致month变量值末尾携带隐形空格,后续拼接日期时会出现内容不匹配。 if语句语法错误:- 字符串判断的两侧取值必须都用双引号包裹,否则含特殊字符、空格时会直接解析失败,原代码拼接后的
%day%-%month%-%year%未加引号 if语句的条件和后续执行的左括号之间必须加空格,原代码%year%(echo yes)会把(echo识别为判断值的一部分,导致整个条件解析失效
- 字符串判断的两侧取值必须都用双引号包裹,否则含特殊字符、空格时会直接解析失败,原代码拼接后的
- 变量名冲突:
date是批处理内置系统变量(代表当前系统日期),用自定义变量覆盖内置变量极易触发不可预期的解析异常。
修复后完整代码
@echo off cls :A echo. :: 替换内置变量名date为自定义名称user_date,避免冲突 set /p user_date=Quelle date souhaitez vous enregistrer (JJ-MM-AAAA) ? for /f "tokens=1,2,3 delims=-" %%a in ("%user_date%") do ( :: 赋值统一用双引号包裹,自动规避行尾空格问题 set "day=%%a" set "month=%%b" set "year=%%c" ) echo %day% set "date1=%day%" echo %date1% echo %month% echo %year% echo %user_date% :: if条件两侧都加引号,条件和左括号之间保留空格 if "%user_date%" == "%day%-%month%-%year%" (echo yes) else (echo no) goto :A
内容的提问来源于stack exchange,提问作者user19349828
相关产品推荐
相关产品推荐

