0

我以前用 %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 代码失败(不同的原因),但我认为 sleep 3 应该至少使时间增加 3。有任何想法吗?tx, tff

4

3 回答 3

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

这样做的“正确”方式可能类似于(来自Raymon Chen 的博客中的这篇文章):

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解析时,所有变量同时展开。

于 2012-12-09T18:50:00.470 回答
1

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

你得到的时间,就是脚本启动的时间。显然%time%环境变量在脚本执行期间没有更新。

于 2012-12-09T18:41:50.843 回答
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

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

于 2012-12-09T18:55:18.180 回答