在我的.bat文件中,我想根據日期時間爲文件/目錄生成唯一的名稱。在批處理腳本中生成帶時間戳的唯一文件名
例如
Build-2009-10-29-10-59-00
問題是%TIME%不會這麼做,因爲它包含文件名中的非法字符(例如':')。
在批處理文件中是否有像'tr'的東西?
任何其他想法如何解決這個問題(除了批解釋器不需要額外的命令行工具)?
在我的.bat文件中,我想根據日期時間爲文件/目錄生成唯一的名稱。在批處理腳本中生成帶時間戳的唯一文件名
例如
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%
並用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。我認爲這很簡單,但有些人使用其他格式,所以要小心。但是因爲你沒有問過我假設的日期,所以你沒有問題。
我使用它爲批處理文件的執行創建唯一的文件名。
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%變量用於使用此腳本創建的其他文件,以便它們都具有相同的日期時間戳記。
爲了使前面的例子中的代碼工作,我需要稍微調整。我想這是因爲我的電腦使用英國的日期格式。要回到「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
希望這樣的例子幫助!
此例程實際上只有一行,適用於設置爲任何日期或時間格式的每個系統。
第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
跟隨@ 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
如果可以保證該機擁有一個特定的版本的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文件系統中的禁止字符。
該死的,這是一個奇特的把戲。 :) cool – 2009-10-29 11:00:22
不像'tr'那麼強大,可能對許多需求來說足夠了。 – Joey 2009-10-29 11:10:59
%時間:〜0.2% - %時間:〜3.2% - %時間:〜6,2%在上午10:00之前創建一個帶空格的字符串! – mcbainpc 2012-07-30 18:26:44