バッチスクリプトでタイムスタンプ付きの一意のファイル名を生成する
-
10-07-2019 - |
質問
.batファイルで、日時に基づいてファイル/ディレクトリの一意の名前を生成します。
e.g。
Build-2009-10-29-10-59-00
問題は、%TIME%
にはファイル名に違法な文字が含まれているため( :
など)実行できないことです。
tr
のようなバッチがありますファイル?
これを解決する他のアイデア(バッチインタープリター以外の追加のコマンドラインユーティリティを必要としない)?
解決
編集:これを行うより良い方法は、%date%
および%のロケール定義のものを使用する代わりに、定義された不変の形式を持つ日付/時刻文字列を取ることです。 time%
。以下を使用して取得できます。
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
20120730203126.530000 + 120
のようなものが生成され、それを使用してファイル名を作成できます。
(以下の古い回答)
問題の文字を単純に空の文字列に置き換えることができます:
echo %time::=%
構文%var:str1 = str2%
は、環境変数(または%TIME%
の場合は擬似変数)を取り、 str1
by str2
。等号の後に何もない場合、 str1
は単に削除されます。
特定の場合、次のものが必要だと思います:
rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%
コロンが使用されているかどうかわからない場合の、より強引な方法(ただし、時間の順序は同じです):
set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%
ただし、上記のすべては、標準のISO 8601日付形式、つまり2009-10-29。私はこれを単純に通常と仮定しますが、他の形式を使用する人もいるので注意してください。しかし、あなたは日付について尋ねなかったので、あなたはそこで問題がなかったと仮定していました。
他のヒント
@Joeyと@Keesの回答をフォローして、すぐに使用できるようにします。
コマンドライン:
FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%
BATファイル内:
@echo off
REM See http://stackoverflow.com/q/1642677/1143274
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2%
echo %DateTime%
出力例:
2014-10-21_16-28-52
これを使用して、バッチファイルの実行用に一意のファイル名を作成します。
REM ****Set up Logging ****
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%
set Logname="PCCU_%mydate%_%mytime%.log"
Echo. >>%Logname% 2>>&1
Echo.=================== >>%Logname% 2>>&1
行を追加する必要がありました
set mytime=%mytime: =0%
午前10時より前に空白が入力されるという同じ問題があったため、9ではなく09になりました。また、このスクリプトで作成した他のファイルに%mydate%および%mytime%変数を再利用しそれらはすべて同じ日付タイムスタンプを持っています。
このルーチンは、実際には1行のみで、任意の日付または時刻形式に設定されたすべてのシステムで機能します。
行1の出力は20140725095527.710000 + 120の形式です
必要な実際の日付/時刻形式は2行目で決定されます。必要に応じて形式を設定できます。
結果のDateTime変数をファイル名に追加するだけです。 Filename_%DateTime%.log
::=======================================================================
::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS
::=======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527
私はこれを普遍的なものにしました。日付形式が異なる可能性のある環境で動作します。
echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt
前の例のコードを機能させるには、少し調整する必要がありました。これは、PCが英国の日付形式を使用しているためだと思われます。戻るには&quot; 2014-04-19&quot; mydateに必要なもの:
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
以下にスクリプト全体を貼り付け、ファイル名の使用方法の例を含めました
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
set mytime=%mytime: =0%
set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log"
Robocopy \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee
これがお役に立てば幸いです!
マシンに特定のバージョンのPythonがインストールされており、システムの PATH
でアクセスできることを保証できる場合、このソリューションを使用できます:
FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print
datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO (
SET TIMESTAMP=%%F
)
ECHO %TIMESTAMP%
これにより、現在のローカル ISO-8601 (ish)の日付表現が< code>%TIMESTAMP%変数をエコーアウトします:
2017-05-25T14:54:37
isoformat()
の後に replace( ':'、 '-')
を追加して、結果の文字列をファイル名またはディレクトリで使用できるようにしました。 :
はWindowsファイルシステムでは禁止文字であるため。