Windows CMD%time%与&;一起使用时提供相同的时间;操作员
我正在使用以下代码对我的脚本进行基准测试Windows CMD%time%与&;一起使用时提供相同的时间;操作员,cmd,Cmd,我正在使用以下代码对我的脚本进行基准测试 C:\Users\blueray>echo %time% & timeout /t 5 & echo %time% 输出 13:44:44.64 ... after 5 seconds 13:44:44.64 当我第二次回显%time%时,我希望有5秒的增量。 这里的问题是什么?解决方案是什么?读取命令行后,%time%将更改为其值,然后执行命令 所有环境参数%arg%在命令行执行之前都会更改 手稿: 读取脚本时,它会逐行执行。
C:\Users\blueray>echo %time% & timeout /t 5 & echo %time%
输出
13:44:44.64
... after 5 seconds
13:44:44.64
当我第二次回显%time%时,我希望有5秒的增量。
这里的问题是什么?解决方案是什么?读取命令行后,
%time%
将更改为其值,然后执行命令
所有环境参数%arg%在命令行执行之前都会更改
手稿:
读取脚本时,它会逐行执行。在这种情况下,您的值将不同。解决方法
(for /F "delims=" %x in ('echo ^%time^%') do echo %x )& timeout /t 2 &(for /F "delims=" %x in ('echo ^%time^%') do echo %x)
Windows命令解释器在执行之前首先预处理/解析整个命令行。在此预处理过程中,
%variable%
格式中的所有环境变量引用都会展开,因此在您的情况下,真正执行的命令行是:
echo 13:44:44.64 & timeout /t 5 & echo 13:44:44.64
有必要强制执行一系列环境变量
通常在批处理文件中使用延迟扩展,如下所示:
setlocal EnableDelayedExpansion
echo !TIME! & timeout /t 5 & echo !TIME!
endlocal
或者在指定可执行文件超时时使用完全限定的文件名,并在第一次时间
引用时使用即时环境变量展开,而在第二次时间
引用时使用延迟展开:
setlocal EnableDelayedExpansion
echo %TIME% & %SystemRoot%\System32\timeout.exe /t 5 & echo !TIME!
endlocal
但是,还有第二种方法可以通过使用命令CALL在批处理文件中获得延迟的环境变量扩展
echo %TIME% & %SystemRoot%\System32\timeout.exe /t 5 & call echo %%TIME%%
批处理文件中的此命令行导致最终执行命令行:
echo 13:44:44.64 & C:\Windows\System32\timeout.exe /t 5 & call echo %TIME%
在执行secondecho之前,命令CALL会对echo%TIME%
进行第二次解析,从而获得比第一次输出晚约5秒的输出时间
在命令提示符窗口中,由于与批处理文件处理相比,%
的解释不同,因此需要不同的命令行
echo %TIME% & timeout /t 5 & call echo ^%TIME^%
百分号字符用插入符号转义,首先将其解释为文字字符,最后执行call echo%TIME%
。实际上,仅转义第二个%
就足够了,而仅转义第一个%
对时间输出没有想要的效果。因此,按预期在命令提示窗口中工作也是:
echo %TIME% & timeout /t 5 & call echo %TIME^%
但在命令提示窗口中未按预期工作的情况是:
echo %TIME% & timeout /t 5 & call echo ^%TIME%
看一看……在由FOR using
cmd.exe/C
启动的后台命令进程中运行每个echo%time%
,通过FOR捕获它们的输出并输出当前命令进程中捕获的时间输出似乎是一个很难使用和理解的解决方法,尽管工作正常。正如我在回答这个问题时所写的那样,有更简单的解决方案。代码运行良好,但我不理解最后一部分。为什么^%TIME^%和%TIME^%有效,但^%TIME%dont@blueray我自己也问过。我没有真正的解释。我认为字符^
只是被忽略了,并被cmd.exe
从命令行中删除了,因为^%TIME%
没有真正转义%
,所以%TIME%
不起作用首先扩大。稍后将从命令行中删除^
。使用%TIME^%
时,环境变量扩展首先失败。