毎日ログファイルを生成するWebサーバーがあり、その日のログは自動的にLog.YYYY-MM-DD.txt
(ieLog.2016-07-20.txt)。
今、私はWindowsタスクスケジューラを使用して前日のログファイルを圧縮する必要がありますが、現在の日付に基づいてファイル名を自動的に識別するオプションが7Zip cmdで利用できますか?
これは、日付変数を設定し、バッチスクリプトが実行されている現在の日付から1日(またはそれに関しては任意の日数)を差し引くバッチスクリプトを使用して行うことができます。したがって、スクリプトの実行をスケジュールする日が、前日のログファイル名の日付値を決定するために計算が行われると予想される日であることを確認する必要があります。
各変数の機能などを説明するためにスクリプトにコメントを追加しましたが、基本的には通常どおりバッチスクリプトで変数を設定し、それらを使用して3つの動的VB = YYYY、MM、およびDD変数について、日付減算計算を実行したり、必要に応じて先行ゼロを追加したりするためのスクリプト。
追加するには:このスクリプトを使用して、マイナスを削除することにより、現在の日付に日数を追加することもできます。 (-
):DynamicVBSScriptBuild
ルーチンの以下のバッチスクリプトからの記号なので、 this,-%MinusDay%,
が表示されている場合は、マイナス記号を削除して、これらの各行で,%MinusDay%,
を取得すると、MinusDay=
変数値が追加する日数と等しくなります。
重要な注意:99999
値で減算する場合、5つの9(MinusDays=
)がバッチスクリプトの制限のようです。 。また、999999
値を追加する場合、6つの9(MinusDays=
)がバッチスクリプトの制限であるようです。
バッチスクリプト
@ECHO ON
::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2
::// Set the archive file full path and file name
SET ArchiveFile=C:\ArchivePath\Archive.Zip
:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A
::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs
::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET WebServerLogFile=Log.%YYYY%-%MM%-%DD%.txt
::CD /D "C:\Program Files\7-Zip"
7z a "%ArchiveFile%" "%WebServerLogPath%\%WebServerLogFile%"
::GOTO EOF
EXIT /B
:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt) >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2) >> "%MMTmpVBS%"
ECHO WScript.Echo mm >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2) >> "%DDTmpVBS%"
ECHO WScript.Echo dd >> "%DDTmpVBS%"
GOTO EOF
日付の計算はいつもかなり複雑だと思います。したがって、私はあなたが必要とするものを達成するための代替ソリューションを提案したいと思います。
別のスケジュールされたタスクを使用して、現在の日付をYYYY-MM-DDの形式でファイルに出力します。あなたはそれを行う方法についての情報を見つけることができます ここ 。
次に、圧縮を担当するスケジュールされたジョブで、ファイルを読み取り、日付と一致するすべてのファイルを圧縮します。唯一の問題は、最初のタスクを1日前に実行する必要があることです。お気に入り:
23:55にタスク1を実行します
00:05にタスク2を実行します
非常に「インテリジェントではない」ように聞こえますが、それで仕事は終わります。