0

私はWindows 8を使用していますが、バッチファイルを書き込んで、タスクの実行時間を記録したいと考えています。だから私はこれを書きます:

@echo off
setlocal

SET STARTTIME=%TIME%

.....do sth. smart.....

SET ENDTIME=%TIME%
SET /A DURATION=%ENDTIME%-%STARTTIME%
SET /A DURATIONH=%DURATION%/360000
SET /A DURATIONM=(%DURATION%-%DURATIONH%*360000)/6000
SET /A DURATIONS=(%DURATION%-%DURATIONH%*360000-%DURATIONM%*6000)/100
SET /A DURATIONHS=(%DURATION%-%DURATIONH%*360000-%DURATIONM%*6000-%DURATIONS%*100)
if %DURATIONH% LSS 10 SET DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 SET DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 SET DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 SET DURATIONHS=0%DURATIONHS%
echo ------------------------------------------------------------------------------------------
echo task start time : %STARTTIME%
echo task end time : %ENDTIME%
echo task end in time : %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%
echo ------------------------------------------------------------------------------------------

endlocal

C:
PAUSE

私はそれを実行し、それは成功しましたが、ログ時間は(fe)です:

task start time 14:35:36,24
task end time 14:39:43,55
task end in time : 00:00:00,14

また、これに演算子がありませんというエラーを表示します:

SET /A DURATION=%ENDTIME%-%STARTTIME%

私たちを手伝ってくれますか?私はその問題について検索していますが、私の問題を解決するものは何も見つかりませんでした

手伝ってくれてありがとう

4

3 に答える 3

1

タイムストリングを秒に変換する必要がありますが、それほど簡単ではありません。

幸いなことに、あなたは 24 時間時計を使用しているので、これは簡単ですが、数学の拡張機能を作成したプログラマーは、何らかの奇妙な理由で、先頭にゼロがある文字列を 8 進数として定義することを決定したため、'08' または '09' を08/09 は有効な 8 進数ではないため、部分文字列はエラーを生成します...

SO - それを乗り越える標準的な方法は、文字列の前に「1」を付けてから 100 を引くことです。

,次の問題は、小数点記号として使用していることです。これにより、INTEGER 数学しか使用できないという問題が複雑になります...

幸いなことに、以前にそのようなことを見ました。ソリューションはUGLY+ですが、機能します。

@ECHO OFF
SETLOCAL
:: simply setting the start and end time to your posted values...
SET starttime=14:35:36,24
SET endtime=14:39:43,55
:: Here are some other value-pairs of interest (1) - elapsed = 8399,04
:: SET starttime=14:35:36,24
:: SET endtime=14:35:35,28
:: Here are some other value-pairs of interest (2) - elapsed = 0,04
:: SET starttime=14:35:36,24
:: SET endtime=14:35:36,28
:: Here are some other value-pairs of interest (3) - elapsed = 0,31
:: SET starttime=14:35:36,24
:: SET endtime=14:35:36,55
:: Here are some other value-pairs of interest (4) - elapsed = 7,31
:: SET starttime=14:35:36,24
:: SET endtime=14:35:43,55
CALL :CONVERT startsecs "%starttime%"
CALL :CONVERT endsecs "%endtime%"
ECHO SET /a elapsed=%endsecs% - %startsecs%
SET /a elapsed=endsecs - startsecs
IF %elapsed% lss 0 SET /a elapsed=%elapsed% + (24*360000)
IF %elapsed% lss 100 (IF %elapsed% lss 10 (SET elapsed=00%elapsed%) ELSE (SET elapsed=0%elapsed%))
ECHO elapsed TIME : %elapsed:~0,-2%,%elapsed:~-2%
::
GOTO :eof
en
:CONVERT
SET hundredths=%~2
SET /a %1=((((((1%hundredths:~0,2%) * 60) + 1%hundredths:~3,2%) * 60) + 1%hundredths:~6,2%) * 100) + 1%hundredths:~9,2% - 36610100
SET /a hundredths=((((((1%hundredths:~0,2% - 100) * 60) + 1%hundredths:~3,2% - 100) * 60) + 1%hundredths:~6,2% - 100) * 100) + 1%hundredths:~9,2% - 100
ECHO %2 %hundredths%
GOTO :eof

テストを簡単にするために、いくつかの値のペアと、規則を使用した経過時間に関するコメントを含めました。

ランク外の最初のキャブは、コンマに対処することです。:convertカンマはデフォルトの区切り記号であるため、簡単な方法は、ルーチンに渡される時間パラメーターを引用することです。最初のパラメーターは、計算結果を入れる変数の名前です。

ルーチン内で、変数hundredthsが 2 番目のパラメーター (引用符で囲まれた時間文字列) に設定され、引用符が削除されます ( %~2)

その後、適切な計算が行われます。SET /a %1=...しばらく行を飛ばして、次の行に必要な計算を示しset hundredths=ます。指定された時刻の各部分文字列を先頭1に を付け、100 を引き、60、60、100 を順に掛けて、真夜中から 100 分の 1 秒を計算します。この計算の結果は、単に表示されます。

に割り当てられた単純化された計算の祖先であるため、完全な計算を含めました%1。魔法の数字 36610100 は、単純に 8 進保護マントラによって計算に追加された定数の合計です。

計算の完全なバージョンは、変換メカニズムには関与しないため、コメント アウトすることができます。結果のECHOは削除するのが最適です - 評価中に結果を表示するだけです。

開始時刻と終了時刻が午前 0 時から 100 分の 1 に変換されたら、減算して経過時間を取得します。結果が 100 未満の場合、先行ゼロをいくつ追加するかを決定し、「PIC 9 の V99 からのように」結果を表示します。

于 2013-04-16T14:56:25.113 に答える
0

時間文字列を減算することはできません。最初に%STARTTIME%%ENDTIME%を秒に変換してから を計算する必要があります%DURATION%。ヒントを与えるために:

set STARTTIME=%TIME%
set /A STARTTIME=%STARTTIME:~0,2%*3600+%STARTTIME:~3,2%*60+%STARTTIME:~6,2%
于 2013-04-16T13:36:29.430 に答える
0

これを試してみてください。24 時間カウントされます (真夜中も 1 倍):

@echo off&setlocal
for /f "tokens=1-3delims=:," %%a in ("%time%") do (
    set /a "shr=(1%%a)-100"
    set /a "smin=(1%%b)-100"
    set /a "ssec=(1%%c)-100"
)
set /a startsec=%shr%*3600+%smin%*60+%ssec%
echo start at sec: %startsec%

ping -n 20 localhost >nul &rem .....do sth. smart.....

for /f "tokens=1-3delims=:," %%a in ("%time%") do (
    set /a "ehr=(1%%a)-100"
    set /a "emin=(1%%b)-100"
    set /a "esec=(1%%c)-100"
)
set /a endsec=%ehr%*3600+%emin%*60+%esec%
echo stop  at sec: %endsec%
if %startsec% leq %endsec% (set /a diffsec=%endsec%-%startsec%) else set /a diffsec=%endsec%+86400-%startsec%
echo running %diffsec% second(s^)
set /a ehr=(%diffsec%/3600)
set /a emin=(%diffsec%-(%ehr%*3600))/60
set /a esec=(%diffsec%-(%ehr%*3600)-(%emin%*60))
echo running for %ehr%h %emin%min %esec%sec
于 2013-04-16T15:05:45.860 に答える