Batch file 为什么我在同一时间内得到了dos语句批处理文件?
我编写了一个批处理文件来获取for语句中cmd的开始时间:Batch file 为什么我在同一时间内得到了dos语句批处理文件?,batch-file,Batch File,我编写了一个批处理文件来获取for语句中cmd的开始时间: 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 20
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"
怎么了?您应该使用延迟扩展
!变数代码>s:
@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
)
您应该使用延迟扩展!变数代码>s:
@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
)
FOR
循环从FOR
解析到最后一个右括号(即您发布的代码段的所有。此时,任何
都将被当前的替换(即解析时间)变量的值。然后执行代码
因此,%date%%time%
在解析命令时被其值替换
您至少可以通过三种方式克服此问题:
1/当%var%仍显示解析时间值,但!var!
显示运行时间值时,通过SETLOCAL ENABLEDELAYEDEXPANSION
指令调用延迟扩展
2/通过调用%%var%%
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
FOR
循环从FOR
解析到最后一个右括号(即您发布的代码段的所有。此时,任何
都将被当前的替换(即解析时间)变量的值。然后执行代码
因此,%date%%time%
在解析命令时被其值替换
您至少可以通过三种方式克服此问题:
1/当%var%仍显示解析时间值,但!var!
显示运行时间值时,通过SETLOCAL ENABLEDELAYEDEXPANSION
指令调用延迟扩展
2/通过调用%%var%%
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