ファイルの命名に日付と時刻のデータを使用するDOSスクリプトのバグに遭遇しました。問題は、時間変数が時間<10の先行ゼロを自動的に提供しなかったため、ギャップが生じてしまったことです。
これを修正するために先行ゼロを条件付きで埋め込む方法を誰かが知っていますか?
詳細:ファイル名設定コマンドは次のとおりです。
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
最終的に:C:\ Temp\robolog_20100602_ 93208.log(午前9時23分)になります。
この質問は this one に関連しています。
ありがとう
非常に簡単な方法は、先頭のスペースをゼロに置き換えるだけです。echo %TIME: =0%
出力:09:18:53,45
私の解決策は、次のアイデアを使用することでした:
SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%
デニスの答え と同様の考え。問題は、%time%
は常に同じなので、短い文字列を返すのではなく、最初にスペースを挿入します。
for
でそれを取り除くことができます:
for /f "delims= " %x in ("%time%") do set T=0%x
残りは多かれ少なかれ同じです。
Jesseの貢献を使用して、出力を変更した変数を作成しました。次に、その変数を参照して時間部分を作成します。
set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log
pause
元のソース:
set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log
ジェシー、ありがとう。評判ポイントがあれば投票したでしょう。
以下は、さらに数行かかりますが、明確で理解可能です。 stdoutとstderrを別々のファイルに保存し、それぞれにタイムスタンプを付けます。タイムスタンプには、年、月、日、時、分、秒の順で含まれます。タイムスタンプには、常に最も重要な日付要素が最初(年)であり、最小要素(秒)が最後でなければなりません。これにより、ファイルリストを時間順に並べることができます。さらに苦労せずに、これが私の解決策です。
:prepare time stamp
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%
:run the program
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
2> RunLogs\err.%timeStamp%
上記のすべてを実装する最もコンパクトなソリューションでは、
/ F "TOKENS = 1-4 DELIMS = /"の場合%% A IN( "%DATE%")/ F "TOKENS = 1-3 DELIMS = :."の場合%% E IN( "%TIME:= 0%")DO SET logfile = C:\ Temp\robolog _ %% D %% C %% B _ %% E %% F %% G.log
スクリプトに新しい行を追加しなくてもここで機能します。ただし、複数のコマンドソリューションほどエレガントではないかもしれません。
これにより、並べ替え可能なタイムスタンプが作成され、2行目では、1桁の時間などのスペースがないことを確認して、スクリプトで使用できるようにします。
set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%
出力:
2018.02.26__9.47.34
これは、時間の初めにゼロを付け、時間の最後の2桁をとります(分と秒の開始位置は1ずつシフトされます)。つまり、午前3時は「03」、次に「03」、15時間目は「015」、「15」になります。
set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log
読みにくい:
set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log
1行のコードで必要な処理を実行できます。
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
たとえば、%Date%を使用してから、変数に先行ゼロを追加して、%Time%の先行スペースをゼロに置き換える必要があるかどうかを判断します。
::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
SET TimeStamp=%Time:~0,8%
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
Echo Started on %Date$ at %TimeStamp%
:: Insert what you are doing here...
SET TimeStamp=%Time:~0,8%
IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
ECHO Finished on %Date% at %TimeStamp%
上からの助けに感謝します...これは私が使っているものです:
C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43
次に、次のようなRobocopyジョブで呼び出されるログがあります。
このようなものがたくさんあります:
Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt
これでジョブを終了します:
REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log
COMPLETE_LOG_2018-06-27_10_53_54.log
は最後に作成されるファイルで、ファイル名でソートできます。
Jesseの答えは、時間フィールドのスペースをなくすことで、ファイルの名前変更の問題を解決しました。これは私が変数を設定する方法です:
for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b
それはチャンピオンのように機能します。何らかの理由で日付は同じ扱いを必要としませんでしたが、それは地域の設定にかかっていると思います。
@echo off
call :PAD aaa,2,0,grw
echo [[aaa=%aaa%]]
pause
rem #### Function PAD ####
goto :PADEND
:PAD <var>,<length>,<padchar>,<string>
set padtot=%~2
set padchar=%~3
set padString=%~4
:StartPADLOOP
call :len lenpadString,%padString%
if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
set padString=%padchar%%padString%
goto :StartPADLOOP
:EndPADLOOP
set %~1=%padString%
GOTO :EOF
:PADEND
rem #### Function LEN ####
goto :LENEND
:LEN <var>,<string>
set LENtempvar=%~2
rem echo {{S:%LENtempvar%}}
set LENCOUNT=0
:startLENLOOP
if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
rem echo {{A:%LENtempvar%}}
set LENtempvar=%LENtempvar:~0,-1%
rem echo {{B:%LENtempvar%}}
set /a LENCOUNT=LENCOUNT+1
goto :startLENLOOP
:endLENLOOP
set %~1=%LENCOUNT%
GOTO :EOF
:LENEND