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 に答える