Отметка времени имени файла в пакетном скрипте Windows CMD

У меня есть пакетный сценарий, который выводит файл, и я стараюсь, чтобы при каждом выполнении сценария никакие существующие файлы не перезаписывались, поэтому я пытаюсь поставить на него метку времени.

В настоящее время у меня есть это:

set  stamp=%DATE:/=-%_%TIME::=-%

Но если время 1-9 утра, это дает что-то вроде:

13-06-2012_ instead of a full 13-06-2012_12-39-37.28

Как я могу это исправить?

Я использую Windows 7, и вывод echo %date% %time% в окне командной строки (мой формат часов для "короткой даты" установлен для отображения трехбуквенных месяцев):

03-Sep-12 9:06:21.54

Изменить: я использовал следующую метку времени в настоящее время, работает хорошо.

set timestamp=%DATE:/=-%_%TIME::=-%
set timestamp=%timestamp: =%

Это произвело отметку времени как: 18-03-2013_13-37-43.26, заменив / а также : в %TIME% а также %DATE%затем зачистка пустого пространства. Пробелы были проблемой в моем первоначальном вопросе.

8 ответов

Решение

Благодаря ответу на вопрос Stack Overflow Создавая имя файла как метку времени в пакетном задании, я обнаружил, что это пробел, оканчивающий имя файла.

Первые четыре строки этого кода предоставят вам надежные переменные YY DD MM YYYY HH Min Sec в XP Pro и выше, используя WMIC.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause

См. Вопрос переполнения стека. Как получить текущую дату и время в командной строке Windows, в подходящем формате для использования в имени файла?,

Создать файл, date.bat:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c)
set mytime=%mytime: =% 
echo %mydate%_%mytime%

Бежать date.bat:

C:\>date.bat
2012-06-14_12-47-PM

ОБНОВИТЬ:

Вы также можете сделать это одной строкой:

for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g

Вот пакетный скрипт, который я сделал для возврата метки времени. Необязательный первый аргумент может быть предоставлен для использования в качестве разделителя полей. Например:

C: \ SYS \ TMP> timestamp.bat
20160404_144741
c: \ sys \ tmp> timestamp.bat -
2016-04-04_14-45-25
c: \ sys \ tmp> timestamp.bat:
2016: 04: 04_14: 45: 29

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: put your desired field delimiter here.
:: for example, setting DELIMITER to a hyphen will separate fields like so:
:: yyyy-MM-dd_hh-mm-ss
::
:: setting DELIMITER to nothing will output like so:
:: yyyyMMdd_hhmmss
::
SET DELIMITER=%1

SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2%
SET TIMESTRING=%TIME%
::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second
set TIMESTRING=%TIMESTRING:~0,-3%

:: Replace colons from TIMESTRING with DELIMITER
SET TIMESTRING=%TIMESTRING::=!DELIMITER!%

:: if there is a preceeding space substitute with a zero
echo %DATESTRING%_%TIMESTRING: =0%
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
echo %DateNtime%

Или из командной строки:

for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g 

РЕДАКТИРОВАТЬ: Согласно нестандартным характеристикам времени / даты Брайса. (03-Sep-12 9:06:21.54)

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do (
  if "%%b"=="Jan" set MM=01
  if "%%b"=="Feb" set MM=02
  if "%%b"=="Mar" set MM=03
  if "%%b"=="Apr" set MM=04
  if "%%b"=="May" set MM=05
  if "%%b"=="Jun" set MM=06
  if "%%b"=="Jul" set MM=07
  if "%%b"=="Aug" set MM=08
  if "%%b"=="Sep" set MM=09
  if "%%b"=="Oct" set MM=10
  if "%%b"=="Nov" set MM=11
  if "%%b"=="Dec" set MM=12
  set HH=0%%d
  set HH=!HH:~-2!
  echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g
)
endlocal

Имя файла пакетного журнала Windows в формате 2018-02-08_14.32.06.34.log:

setlocal
set d=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%
set t=%time::=.% 
set t=%t: =%
set logfile="%d%_%t%.log"

ping localhost -n 11>%1/%logfile%
endlocal

В прошлом я использовал скрипт.cmd, который нашел в интернете. Я ненавижу способ, которым локализация обычно портится с датами. Каждый раз, когда у вас есть даты в именах файлов (или где-то еще, если я могу быть настолько смелым), я полагаю, что вы хотите, чтобы они были в формате ISO 8601:

2015-02-19T14: 54: 51Z

или что-то еще, что имеет Y M D H M в этом порядке, такие как

2015-02-19 14:54

потому что это исправляет неоднозначность MDY / DMY и потому что это можно сортировать как текст.

Я не знаю, где я взял этот сценарий.cmd, но, возможно, это был http://ss64.com/nt/syntax-getdate.html, который прекрасно работает на моем YYYY-MM-DD Windows 8.1 и на M/D/ ГГГГ ванильная установка Windows 7. Оба дают одинаковый формат:

2015-02-09 04:43

ПАКЕТНЫЙ /CMD-ФАЙЛ, например DateAndTime.cmd (не в CMD-Console)

Код:

SETLOCAL EnableDelayedExpansion
(set d=%date:~8,2%-%date:~3,2%-%date:~0,2%) & (set t=%time::=.%) & (set t=!t: =0!) & (set STAMP=!d!__!t!)

Создать вывод:

echo %stamp%

Выход:

2020-02-25__08.43.38.90

Или также возможно в строках CMD-Console и BATCH /CMD File

set d=%date:~6,4%-%date:~3,2%-%date:~0,2%
set t=%time::=.%
set t=%t: =0%
set stamp=%d%__%t%

"Создать вывод" и "Вывод", как указано выше

Он хочет полный рабочий день в DD-MM-YYYY_HH-MM-SS.TT где TT это галочки. Исключение говорит само за себя.

Другие вопросы по тегам