Сгенерируйте уникальное имя файла с меткой времени в пакетном скрипте
-
10-07-2019 - |
Вопрос
В моем файле .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%
и заменяет 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, i.e.2009-10-29.Я бы предположил, что это просто нормально, но некоторые люди используют другие форматы, так что будьте осторожны.Но поскольку вы не спросили о дате, я предположил, что у вас не было с этим проблем.
Другие советы
Следите за ответами @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
Я использую это, чтобы создать уникальное имя файла для выполнения пакетного файла.
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 выполнен в формате 20140725095527.710000+120
Фактический формат даты / времени, который вам нужен, определяется в строке 2.Вы можете отформатировать его так, как хотите.
Просто добавьте результирующую переменную DateTime в ваше имя файла ie.Имя_файла_%Дата-время%.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
Я сделал это универсальным, будет работать в любой среде, где формат даты может отличаться.
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
Чтобы заставить код в предыдущем примере работать, мне нужно было немного подкорректировать.Я предполагаю, что это связано с тем, что мой компьютер использует британский формат даты.Чтобы вернуть "2014-04-19" в мою дату, мне нужно было:
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
Надеюсь, это поможет!
Если ты сможешь гарантия что на компьютере установлена определенная версия 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.