Создайте уникальное имя файла с меткой времени в пакетном режиме script
В моем .bat файле я хочу сгенерировать уникальное имя для файлов/каталогов на основе даты.
например.
Build-2009-10-29-10-59-00
Проблема заключается в том, что% TIME% не будет работать, поскольку содержит символы, которые являются незаконными в имени файла (например, ':').
Есть ли что-то вроде "tr" в пакетных файлах?
Любые другие идеи, как это решить (которые не требуют дополнительных утилит командной строки, кроме пакетного интерпретатора)?
Ответы
Ответ 1
EDIT: лучший способ сделать это - взять строку даты/времени, которая имеет определенный и неизменный формат, вместо использования локально определенных из %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. Я бы предположил, что это просто нормально, но некоторые люди используют другие форматы, поэтому будьте осторожны. Но так как вы не спрашивали о дате, которую я предполагал, у вас не было проблем.
Ответ 2
Следуйте за ответами @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
Ответ 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:00, теперь я получаю 09 вместо 9. Я также повторно использую переменную% mydate% и% mytime% для других файлов, которые я создаю с помощью этого script так что все они имеют одну и ту же дату.
Ответ 4
Эта процедура, фактически только одна строка, работает на каждой системе, установленной в любой формат даты или времени.
Вывод строки 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
Ответ 5
Чтобы сделать код в предыдущем примере, мне нужно немного настроить. Я предполагаю, что это потому, что мой компьютер использует формат даты в Великобритании. Чтобы вернуться "2014-04-19" в mydate мне нужно:
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
Ниже я ввел свой общий script и включил пример использования имени файла
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
Надеюсь, это поможет!
Ответ 6
Если вы можете гарантировать, что на компьютере установлена определенная версия 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.