2009-10-29 38 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%需要的環境變量(或僞變量的情況下, %TIME%並用str2代替str1。如果在等號後面沒有任何字符,那麼簡單地刪除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。即2009-10-29。我認爲這很簡單,但有些人使用其他格式,所以要小心。但是因爲你沒有問過我假設的日期,所以你沒有問題。

+1

該死的,這是一個奇特的把戲。 :) cool – 2009-10-29 11:00:22

+0

不像'tr'那麼強大,可能對許多需求來說足夠了。 – Joey 2009-10-29 11:10:59

+0

%時間:〜0.2% - %時間:〜3.2% - %時間:〜6,2%在上午10:00之前創建一個帶空格的字符串! – mcbainpc 2012-07-30 18:26:44

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 

我不得不添加行

set mytime=%mytime: =0% 

,因爲我有一個地方是空白的被前上午10點進入了同樣的問題,現在我得到的09,而不是9,我還重用%指明MyDate %和%mytime%變量用於使用此腳本創建的其他文件,以便它們都具有相同的日期時間戳記。

1

爲了使前面的例子中的代碼工作,我需要稍微調整。我想這是因爲我的電腦使用英國的日期格式。要回到「2014年4月19日」 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 

希望這樣的例子幫助!

2

此例程實際上只有一行,適用於設置爲任何日期或時間格式的每個系統。
第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 
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% 

這將使當前本地ISO-8601(ISH)日表示成%TIMESTAMP%變量和回聲它,就像這樣:

2017-05-25T14:54:37 

我已經把replace(':', '-')之後的isoformat(),以便結果字符串可以在文件名或目錄中使用,因爲:是Windows文件系統中的禁止字符。

相關問題