0

我写了一个批处理文件来获取 cmd 在 for 语句中的开始时间:

for /L %%i in (1,1,3) do (
echo %%i
echo "traceroute %%i start at %date% %time%" >tr%%i.txt
adb shell "/data/local/traceroute smtp.163.com" 2>&1 >>tr%%i.txt
)

但在 3 个结果文件中得到了相同的时间:

"traceroute 1 start at 2013/03/27 周三 15:48:47.12"

"traceroute 2 start at 2013/03/27 周三 15:48:47.12" 

"traceroute 3 start at 2013/03/27 周三 15:48:47.12" 

怎么了?

4

2 回答 2

3

FOR循环是从parsedFOR其最后的右括号(即ALL您发布的代码段。此时,ANY %var%将被THEN-CURRENT变量的(即 PARSE-TIME)值替换。然后执行代码。

因此%date% %time%在命令被解析时被它们的值替换。

您可以通过至少三种方式克服这个问题:

1/ 使用 DELAYED EXPANSION,由SETLOCAL ENABLEDELAYEDEXPANSION指令调用,当 %var% STILL 显示 PARSE-TIME 值,但!var!显示 RUN-TIME 值 2/ 通过%%var%% CALLing 间接扩展 3/ 使用子例程或外部批处理文件

试试这个代码:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%i IN (1 2 3) DO (
ECHO START of run %%i
ECHO using ^!time^! : !time! - PARSE TIME was %time%
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%%
CALL :report
timeout /t 5
ECHO using ^!time^! : !time!
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%%
CALL :report
ECHO END of run %%i
ECHO.
)
GOTO :eof

:report
ECHO :report says TIME is %TIME%
GOTO :eof
于 2013-03-27T08:39:36.707 回答
1

您应该使用延迟扩展!variable!

@echo off &setlocal enabledelayedexpansion
for /L %%i in (1,1,3) do (
echo %%i
echo "traceroute %%i start at !date! !time!" >tr%%i.txt
adb shell "/data/local/traceroute smtp.163.com" 2>&1 >>tr%%i.txt
)
于 2013-03-27T08:28:09.380 回答