Сгенерируйте уникальное имя файла с меткой времени в пакетном скрипте

StackOverflow https://stackoverflow.com/questions/1642677

Вопрос

В моем файле .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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top