web-dev-qa-db-ja.com

バッチスクリプトでタイムスタンプ付きの一意のファイル名を生成する

.batファイルで、日時に基づいてファイル/ディレクトリの一意の名前を生成します。

例えば.

Build-2009-10-29-10-59-00

問題はそれです %TIME%は、ファイル名に違法な文字が含まれているため実行しません(例::)。

バッチファイルに tr のようなものがありますか?

これを解決する他のアイデア(バッチインタープリター以外の追加のコマンドラインユーティリティを必要としない)?

36
Assaf Lavie

編集:これを行うより良い方法は、%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%の場合は疑似変数を取り、str1str2に置き換えます。等号の後に何もない場合、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日付形式iを使用することを前提としています。 e。 2009-10-29。私はこれを単純に通常と仮定しますが、他の形式を使用する人もいるので注意してください。しかし、あなたは日付について尋ねなかったので、私はあなたがそこで問題を抱えていないと仮定していました。

42
Joey

@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
17
Evgeni Sergeev

これを使用して、バッチファイルの実行用に一意のファイル名を作成します。

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%変数を再利用して、同じ日付タイムスタンプ。

3
Ben

このルーチンは、実際には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
2
Kees

私はこれを普遍的なものにしました。日付形式が異なる可能性のある環境で動作します。

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
2
Ariful Huq

前の例のコードを機能させるには、少し調整する必要がありました。これは、PCが英国の日付形式を使用しているためだと思われます。 mydateで「2014-04-19」を取得するには、次が必要です。

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 

お役に立てれば!

1
Stewart

guaranteeマシンに特定のバージョンの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)日付表現が_%TIMESTAMP%_変数に入れられ、次のようにエコーアウトされます。

_2017-05-25T14:54:37
_

_:_はWindowsファイルシステムで禁止されている文字なので、結果の文字列をファイル名またはディレクトリで使用できるように、replace(':', '-')の後にisoformat()を追加しました。

0
Colin Basnett