2009-10-29 11 views
33

私の.batファイルに、日付/時刻に基づいてファイル/ディレクトリの一意の名前を生成したいとします。バッチスクリプトでタイムスタンプ付きの固有のファイル名を生成

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

%TIME%は、ファイル名に不正な文字(「:」など)が含まれているため、問題が発生しません。

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

これを解決する方法(バッチインタプリタ以外の余分なコマンドラインユーティリティは不要)はありますか?

答えて

41

編集:より良い方法は、ロケール定義のものを%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%がある場合には、環境変数(または擬似変数を取ります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の日付形式を使用することを前提としています。 e。 2009-10-29。私はこれを単純に通常と見なしますが、他のフォーマットを使用する人もいるので注意が必要です。しかし、私はあなたがそこに問題がなかったと仮定していた日付について尋ねなかったので。

+1

これはファンキーなトリックです。 :) cool –

+0

'tr'ほど強力ではないかもしれませんが、多分多くのニーズには十分です。 – Joey

+0

%時間:〜0.2% - %時間:〜3,2% - %時間:〜6,2%は、午前10時前に空白文字列を作成します! – mcbainpc

3

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

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 

私は今、私は09の代わりに、9私も%のMyDateに該当を再利用し得る、ブランクは午前10時前に入力されていた同じ問題を抱えていたので、私は

set mytime=%mytime: =0% 

行を追加する必要がありましたこのスクリプトで作成した他のファイルの%%および%mytime%変数は、すべて同じ日付タイムスタンプを持つようにします。

1

前の例のコードを動作させるには、少し調整する必要がありました。これは私のPCが英国の日付形式を使用しているためです。MyDateに該当に戻って「2014年4月19日を」得るために私が必要:私は私の合計のスクリプトを貼り付け、ファイル名に

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 

希望これを使用する方法の例を含めました下

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) 

助けて!

2

このルーチンは実際には1行だけで、すべてのシステムで任意の日付または時刻形式に設定できます。
1行目の出力は20140725095527.710000 + 120

の形式です。必要な実際の日付/時刻の形式は2行目で決まります。必要に応じてフォーマットすることができます。
結果のDateTime変数をファイル名に追加するだけです。ファイル名_%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 
14

@ Joey'sと@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 
0

もしすることができますマシンは、特定のを持っていることを保証バージョンのPythonがインストールされ、システムの01でアクセス可能、あなたはこのソリューションを使用することができます。

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% 

これは%TIMESTAMP%変数に現在のローカルISO-8601(ISH)日付表現を入れて、それをエコー、そうのようになります:

2017-05-25T14:54:37 

私が置かれていますisoformat()の後にreplace(':', '-')の文字列を使用すると、Windowsファイルシステムでは:が禁止文字なので、結果の文字列をファイル名またはディレクトリで使用することができます。

関連する問題