Подтвердить что ты не робот

Создайте уникальное имя файла с меткой времени в пакетном режиме script

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

например.

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

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

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

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

4b9b3361

Ответ 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.