正如我在问题中刚刚提到的,@echo off
命令有时会表现得很奇怪,并且无法按我们期望的那样工作。
例如,查看批处理文件中的以下语法:
@echo off & set TIME=%TIME: =0% >nul & set DateTimeFn=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%_%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2% >nul & echo %DateTimeFn% & pause > nul
现在,当我运行该脚本时,我得到的唯一输出是ECHO is off.
。
我希望使用所需的datetime
字符串,因为我已经在文件中对其进行了编码。
有人可以帮助我了解问题,逻辑和解决方法吗?
答案 0 :(得分:1)
您有延迟扩展问题。当执行批处理文件中的一行代码时,在执行任何命令之前,首先将所有变量扩展为它们的值。要解决此问题,您需要启用延迟扩展。我不知道您为什么要将所有这些命令放在批处理文件中的一行上,但这会做您想要的事情。
@echo off &setlocal enabledelayedexpansion & set TIME=%TIME: =0% >nul & set DateTimeFn=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%_!TIME:~0,2!_!TIME:~3,2!_!TIME:~6,2! >nul & echo !DateTimeFn! & pause
答案 1 :(得分:1)
从不写入预定义或内置变量,例如DATE
或TIME
!像这样写TIME
后,echo %TIME%
将不再返回当前系统时间,而是您分配的值!
您应该避免多次读取DATE
和TIME
,因为这些值(例如RANDOM
)会被各个值扩展,因此{{1}中的第一个和第二个值}可能会有所不同(为证明这一点,请写一条很长的行echo %TIME% %TIME%
,因此您可能会看到不同的值)。
为什么要在一行中编写所有命令?正如Squashman在his answer中所指出的,这需要delayed variable expansion。而是在自己的行中编写每个命令,因此可以使用常规的echo %TIME% %TIME% %TIME% ...
扩展:
%
您可能已经认识到我推荐使用引号@echo off
set "Time0=%TIME: =0%"
set "Date_=%DATE%"
set "DateTimeFn=%Date_:~10,4%-%Date_:~4,2%-%Date_:~7,2%_%Time0:~0,2%_%Time0:~3,2%_%Time0:~6,2%"
echo %DateTimeFn%
pause > nul
来避免不必要的尾随空格并保护字符串中的特殊字符,但在变量值中不要使用引号set
。
答案 2 :(得分:0)
您有一个延迟的扩展问题,已在Squashman的答案中得到解决,但您还应注意,echo off
本身不会产生任何影响,因为决定是否命令回显当前语句(s)是在执行该行之前根据 echo 的先前状态(默认为 on )进行的。
只是@
会在单线中关闭回声。您可以通过删除echo off
,但将@
保留在行首来实现相同的目的。
实际上,echo off
在单线下是多余的。