Генерация уникального имени файла с отметкой времени в пакетном скрипте - PullRequest
36 голосов
/ 29 октября 2009

В моем файле .bat я хочу создать уникальное имя для файлов / каталогов на основе даты и времени.

, например

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

Проблема в том, что %TIME% не подойдет, поскольку содержит недопустимые символы в имени файла (например, :).

Есть ли что-то вроде tr в пакетных файлах?

Любые другие идеи, как решить эту проблему (которые не требуют дополнительных утилит командной строки, кроме пакетного интерпретатора)?

Ответы [ 7 ]

42 голосов
/ 29 октября 2009

РЕДАКТИРОВАТЬ: лучший способ сделать это - взять строку даты / времени, которая имеет определенный и неизменный формат, вместо того, чтобы использовать определенные из локали значения из %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 на 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. Я бы предположил, что это просто нормально, но некоторые люди используют другие форматы, поэтому будьте осторожны. Но так как вы не спросили о дате, я предполагал, что у вас нет проблем там.

17 голосов
/ 21 октября 2014

Отслеживание ответов @ 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
3 голосов
/ 08 ноября 2013

Я использую это для создания уникального имени файла для выполнения командного файла.

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:00, теперь я получаю 09 вместо 9. Я также повторно использую переменные% mydate% и% mytime% для других файлов, которые я создаю с помощью этого сценария, чтобы все они имеют одинаковую отметку даты и времени.

2 голосов
/ 31 декабря 2018

Я сделал это универсальным, Будет работать в любой среде, где формат даты может отличаться.

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 голосов
/ 25 июля 2014

Эта процедура, фактически только одна строка, работает в каждой системе, настроенной на любой формат даты или времени.
Вывод строки 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
1 голос
/ 19 апреля 2014

Чтобы код в предыдущем примере работал, мне нужно было немного настроить. Я предполагаю, что это потому, что мой компьютер использует британский формат даты. Чтобы вернуться "2014-04-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 

Надеюсь, это поможет!

0 голосов
/ 26 мая 2017

Если вы можете гарантировать , что на машине установлена ​​конкретная версия 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

Я поставил replace(':', '-') после isoformat(), чтобы результирующая строка могла использоваться в имени файла или директории, поскольку : является запрещенным символом в файловой системе Windows.

...