Windows批处理文件计时错误

时间:2012-12-09 18:34:30

标签: windows batch-file timing

我之前使用%time%进行计时 - 至少我认为我有。我有这个奇怪的

IF NOT "%1" == "" (
    echo Testing: %1
    echo Start: %time%
    sqlcmd -S MYSERVER  -i test_import_%1.sql -o "test_%1%.log"
    sleep 3
    echo End:   %time%
)

我运行它,然后打印:

Testing: pm
Start: 13:29:45.30
End:   13:29:45.30

在这种情况下,我的sql代码失败(不同的原因),但我认为睡眠3应该至少使时间增加3。有任何想法吗? TX, TFF

3 个答案:

答案 0 :(得分:3)

这与(不)延迟扩展有关,但我不记得它是如何工作的。你可以使用这样的“子程序”解决它:

@echo off
if "%1" == "" (
  call :doit
)

echo done
goto :eof

:doit
echo %time%
sleep 1
echo %time%
goto :eof

输出:

C:\temp>q
19:46:36.43
19:46:37.45
done

执行此操作的“正确”方式可能类似于(来自this entry in Raymon Chen's blog):

setlocal enabledelayedexpansion
if "%1" == "" (
  echo !time!
  sleep 2
  echo !time!
)

要“看到”立即展开的问题,只需运行此操作(不带 echo off):

if "%1" == "" (
echo %time%
sleep 2
echo %time%
)

输出(在Windows 7上):

C:\temp>if "" == "" (
echo 19:48:31.95
 sleep 2
 echo 19:48:31.95
)
19:48:31.95
19:48:31.95

当解析if时,变量全部同时展开。

答案 1 :(得分:1)

Pause根本不接受参数。它不会失败,但它也不会继续。如果一切正常,您应该看到按键的提示。

获得的时间是脚本启动的时间。显然,在执行脚本期间不会更新%time%环境变量。

答案 2 :(得分:1)

DOS没有“睡眠”功能。您需要将其添加到批处理文件的末尾(或类似的内容):

@ECHO off
TITLE Initial title
SET TITLETEXT=Sleep
:: start of script
CALL :sleep 5
:: rest of script
GOTO :END
:: Function
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) do (TITLE %TITLETEXT% -- time left %%as&PING.exe -n 2 -w 1 127.0.0.1>nul)
EXIT /B 0
:END
pause
::this is EOF

我测试了这段代码,它应该可以正常工作。