毎日実行され、ピックアップフォルダーにファイルをコピーするバッチジョブがあります。また、そのファイルのコピーを取り、ファイル名を付けてアーカイブフォルダーにドロップします。
yyyy-MM-dd.log
Windowsバッチジョブでこれを行う最も簡単な方法は何ですか?
私は基本的に、このUnixコマンドに相当するものを探しています。
cp source.log `date +%F`.log
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
ただし、ロケールに依存します。 %DATE%
がローカライズされているか、Windowsの短い日付に指定されている形式に依存しているかどうかはわかりません。
以下は this answer から現在の日付を抽出するロケールに依存しない方法ですが、WMIC
とFOR /F
に依存します:
FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
これは私にとってはうまくいき、ファイル名セーフなソリューションでした(ただし、MM-dd-YYYY形式を生成します)。
C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
[email protected]
最初のコマンドはDATEを取り、/
を-
で置き換え、TIMEを取り、:
を-
で置き換え、それらをDATE @ TIME形式に結合します。 2番目のset
ステートメントはスペースを削除し、3番目のset
は,
を.
に置き換え、.jpg
拡張子を追加します。
上記のコードは、さらなる処理のためにセキュリティIPカメラから画像を取得する小さなスクリプトで使用されます。
:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while
フランス語ロケール(フランス)のみの場合、/
が日付に表示されるため、注意が必要です。
echo %DATE%
08/09/2013
ログファイルの問題については、フランス語ロケールのみの提案です。
SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
これはロケールに依存しないソリューションです(SetDateTimeComponents.cmdという名前のファイルにコピーします):
@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html
REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $d $t"') do (
for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set ss=%%o
)
)
REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%
すべての.cmdスクリプトを同じフォルダー(%SCRIPTROOT%)に入れました。日付/時刻の値を必要とするスクリプトは、次の例のようにSetDateTimeComponents.cmdを呼び出します。
setlocal
@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err
:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%
:: Perform some long running action and log errors to ERRLOG.
:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%
例が示すように、日付/時刻の値を更新する必要があるときはいつでもSetDateTimeComponents.cmdを呼び出すことができます。独自のSetDateTimeComponents.cmdファイルで時間解析スクリプトを非表示にすることは、見苦しい詳細を非表示にし、さらに重要なことに、タイプミスを回避する良い方法です。
これにより、出力が2桁の値になることが保証されます。診断セクションのコメントを外すことで、出力を好みに合わせてテストすることができます。楽しい!
(私は他のフォーラムからこれをたくさん借りました...)
:: ------------------ Date and Time Modifier ------------------------
@echo off
setlocal
:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES
:: CREATE VARIABLE %TIMESTAMP%
for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $D $T"') do (
for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)
:: ensure that hour is always 2 digits
if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09
:: --------- TIME STAMP DIAGNOSTICS -------------------------
:: Un-comment these lines to test output
:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello!
:: echo Today is %dow%, %mm%/%dd%.
:: echo.
:: echo.
:: echo.
:: echo.
:: pause
:: --------- END TIME STAMP DIAGNOSTICS ----------------------
:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "
endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%
私はこれを頻繁に使用し、すべてを単一のコピーコマンドに入れます。次の例では、example.txtをexample_YYYYMMDD_HHMMSS.txtとしてコピーします。もちろん、好みの形式に合わせて変更できます。引用符は、filespecにスペースがある場合にのみ必要です。まったく同じ日付/タイムスタンプを再利用する場合は、変数に保存する必要があります。
copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
%DATE%
と%TIME%
を引き裂き、それらを元に戻すという考えはせいぜい壊れやすいように思えるので、PowerShellのワンライナーを使用する代替手段を次に示します。
for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt
get-date
のリファレンスは here で、.NETスタイルとUNIXスタイルの両方のフォーマットオプションがあります。
現在の日付をファイル名としてファイルを作成します(例:2008-11-08.dat)
echo hello > %date%.dat
現在の日付を使用し、「-」を使用しない(例:20081108.dat)
echo hello > %date:-=%.dat
私はこれが古い投稿であることを知っていますが、FARの簡単な答えがあります(ただし、新しいバージョンのWindowsでのみ機能するかもしれません)。 DATEおよびTIMEのdosコマンドに/ tパラメーターを使用して、日付または時刻のみを表示し、次のように設定するよう要求することはありません。
@echo off
echo Starting test batch file > testlog.txt
date /t >> testlog.txt
time /t >> testlog.txt
現在のローカル形式を簡単に検出し、形式で日付を取得できます。次に例を示します。
::for 30.10.2016 dd.MM.yyyy
if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2%
::for 10/30/2016 MM/dd/yyyy
if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2%
::for 2016-10-30 yyyy-MM-dd
if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2%
::variable %d% have now value: 2016103 (yyyyMMdd)
set t=%time::=%
set t=%t:,=%
::variable %t% have now time without delimiters
cp source.log %d%_%t%.log
現在のタイムスタンプを出力するために、小さなCプログラムを作成しました(ロケールセーフ、悪い文字はありません...)。次に、FORコマンドを使用して、結果を環境変数に保存します。
:: Get the timestamp
for /f %%x in ('@timestamp') do set TIMESTAMP=%%x
:: Use it to generate a filename
for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"
リンクは次のとおりです。
多分これは助けることができます:
echo off
@Prompt set date=$d$_ set time=$t$h$h$h
echo some log >> %date% %time%.log
exit
または
echo off
set v=%date%.log
echo some log >> %v%
1)GNU coreutils をダウンロードできます。これにはGNU dateが付属しています
2) VBScript を使用できます。これにより、Windowsでの日付操作が簡単になります。
Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
current = Now
mth = Month(current)
d = Day(current)
yr = Year(current)
If Len(mth) <2 Then
mth="0"&mth
End If
If Len(d) < 2 Then
d = "0"&d
End If
timestamp=yr & "-" & mth &"-"& d
For Each strFile In objFolder.Files
strFileName = strFile.Name
If InStr(strFileName,"file_name_here") > 0 Then
BaseName = objFS.GetBaseName(strFileName)
Extension = objFS.GetExtensionName(strFileName)
NewName = BaseName & "-" & timestamp & "." & Extension
strFile.Name = NewName
End If
Next
次のようにスクリプトを実行します。
c:\test> cscript /nologo myscript.vbs
私はこのスレッドが古いことを知っていますが、これをここで追加したいと思います。これの良いところは、常に実行しているバッチファイルのループに入れることができることです。サーバーの稼働時間ログなど。それはとにかくそれを使用するものです。これがいつか誰かを助けることを願っています。
@setlocal enableextensions enabledelayedexpansion
@echo off
call :timestamp freshtime freshdate
echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log"
:timestamp
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set FreshTime=%hour%:%min%:%secs%
set year=%date:~-4%
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~7,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set FreshDate=%month%.%day%.%year%
展開用の大きなZipファイルの場合、15時間を使用します。このページの他の誰もそれについて言及していなかったので、ここに私の小さなスクリプトを置きます。
set /a "quarter_hours=%time:~0,2%*4 + %time:~3,2% / 15"
set "Zip_file=release_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.%quarter_hours%.Zip"
午前0時から午前5時までの15分のゼロパッドはまだ行われていませんが、衝突がほとんどない状態で1日に何度もスタンプ付きリリースを行えるようになっています。
それが役に立てば幸いです。
これは(私の)ドイツ語ロケールでうまく機能します。ニーズに合わせて調整できるはずです...
forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file
%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_@file"