在一行中组合命令时,@ echo off不能正常工作

时间:2018-07-18 22:44:17

标签: windows batch-file cmd

正如我在问题中刚刚提到的,@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字符串,因为我已经在文件中对其进行了编码。

有人可以帮助我了解问题,逻辑和解决方法吗?

3 个答案:

答案 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)

从不写入预定义或内置变量,例如DATETIME!像这样写TIME后,echo %TIME%将不再返回当前系统时间,而是您分配的值!

您应该避免多次读取DATETIME,因为这些值(例如RANDOM)会被各个值扩展,因此{{1}中的第一个和第二个值}可能会有所不同(为证明这一点,请写一条很长的行echo %TIME% %TIME%,因此您可能会看到不同的值)。

为什么要在一行中编写所有命令?正如Squashmanhis 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在单线下是多余的。