Командная строка Windows: создайте файл с текущей датой в названии


19

Я пытаюсь создать zip-файл из пакетного скрипта. Мне нужно, чтобы он был назван как archive_.zip

К сожалению, это не работает в системах с датой, отформатированной как y / m / d из-за косой черты:

zip some_options "archive_%DATE%.zip"

%DATE%Переменная расширяется что - то вроде

Mon 09/28/2009

У меня есть доступ к пакету gnuwin32, так что я могу использовать, скажем, sedдля замены пробелов и косых черт тире. Проблема в том, как бы я использовал вывод sedдля создания имени файла zip-архива?

В Unix (bash) можно использовать обратные кавычки для оценки команды на месте и использовать ее вывод в другой команде, например:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Есть ли что-нибудь подобное в Windows?

Или, может быть, есть способ установить переменную в возвращаемое значение sedи использовать ее для создания имени файла?

Ответы:


27

Вы можете заменить символы в переменных с помощью:

set _date=%DATE:/=-%

1
Это изящный трюк!
Кристи Диаконеску

PS Есть ли «однострочный» способ избавиться от пробелов или других неприятных персонажей? (в отличие от наличия 3-й ... n-й временной переменной для замены каждого символа)
Кристи Диаконеску

Нет простите. Кажется, нет такой вещи. Вы должны использовать синтаксис for для этого. NB. Это хороший справочник по пакетному программированию: robvanderwoude.com/batchfiles.php
Кристофер,

5
это даже быстрее , чем: %date:~-10,2%-%date:~-7,2%-%date:~-4,4% !
Джесс Стоун

Как никто не +1 твой ответ Джесс Стоун! +1 от меня !!!
Арво Боуэн

5

Я всегда использую:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

Тогда CDate будет Sat02182012. Если вы хотите сделать его более сортируемым, установите CDate в %% d - %% b - %% c, так что 2012-02-18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

Чтобы сделать папку с датой и временем дружественной к файлам.


4

Я разместил ответ на очень похожий вопрос здесь . Расщепление даты в полях выполняется в 1 строку вместо нескольких строк в ответе Гаррима.

Интересная часть:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

И предупреждение по-прежнему актуально:

Предупреждение : формат даты (yyyymmdd = %% k %% j %% i) зависит от ваших региональных настроек. Поскольку я использую французский формат даты (дд / мм / гггг), я должен использовать «%% k %% j %% i» в качестве формата (%% i = день, %% j = месяц, %% j = год).

Если ваши региональные настройки настроены на стиль США (мм / дд / гггг), вы должны использовать «%% k %% i %% j» (%% i = месяц, %% j = день, %% j = год) ,


3
zip some_options "archive_%date:/=-%.zip"

/=-подставляет /со знаком минус.


2

Этот довольно ужасный кусок кода должен делать что-то вроде того, что вы хотите

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

Если вы измените имя файла соответствующим образом.


1
Хотите объяснить чудовищность? :)
Кристи Диаконеску

Это в основном вырезание битов из даты и подача его в середину имени файла, вы можете проверить это, выполнив echo, а затем часть ужаса в командной строке, так что если вы сделаете echo% date: ~ 6,4%, это даст год. Это просто подстрока даты и времени.
полковник

Интересный. К сожалению, не слишком портативный ...
Кристи Диаконеску

К сожалению, проблема с использованием подстрок заключается в том, что он зависит от определенного формата даты и взрывается, когда он отличается. echo %date:~6,4%%date:~3,2%%date:~0,2%возвращается 9-289-20на мою машину, так как у меня установлена ​​дата использования yyyy-MM-dd (поэтому сегодня 2009-09-28).
Джошуа

Правда, я использую это решение только на одной машине, так что это не слишком большая проблема.
полковник

2

Поскольку ваш вопрос помечаются как Windows, я нашел решение , которое работает в старых добрых .bat файлах:
«Windows Batch File (.bat) , чтобы получить текущую дату в формате ММДДГГГГ» ,
и , вероятно , может быть адаптировано к вашему делу:

echo в
@REM Пакет быстрой обработки даты Seamonkey (формат MMDDYYYY)
@REM Настройки%% переменной даты
@REM Сначала анализирует месяц, день и год в форматах mm, dd, yyyy, а затем объединяет их в MMDDYYYY.

FOR / F “TOKENS = 1 * DELIMS =” %% A IN ('DATE / T') DO SET CDATE = %% B
FOR / F “TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') DO SET мм = %% B
FOR / F “TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') DO SET dd = %% B
FOR / F “TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') DO SET yyyy = %% Bv vSET date =% mm %% dd %% yyyy%

это ничего не делает, но устанавливает переменную% date в сегодняшнюю дату в формате MMDDYYYY, чтобы ее можно было вызвать позже в скрипте.

Править
Найден лучший синтаксис. Учитывая, что моя дата сегодня "Пн 28/09/2009":
установленный день =% Дата: ~ 0,2%
установленный месяц =% Дата: ~ 7,2%
установленный год =% Дата: ~ 10,4%


2

Чистая версия cmd.exe в сочетании с gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

Так что он может делать замены на месте! Если вы спросите меня, команда 'for' имеет один странный синтаксис ...
Кристи Диаконеску,

я не утверждал, что это не могло :) всякие "cmd" вещи в любом случае сумасшедшие, кто бы ни придумал это глубоко в какой-то дурной сон. cmd «for» фактически создает строки (иначе «разворачивает» «цикл») при первом проходе, а затем выполняет созданный таким образом сценарий.
Акира

1

как насчет использования cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

позвоните через

cscript /nologo zip_it.vbs

1

Для / f "токенов = 1,2,3,4,5 delims = /." %% a in ('date / T') установите CDate = %% d - %% b - %% c

@echo data =% CDate%

Это в год-месяц-день, который наиболее распространен в наши дни


1

Любое решение, которое использует либо %DATE%вывод, либо date /tможет выйти из строя, если пользователь изменил свои региональные настройки. Например, я установил свой формат «короткой даты» "yyyy-MM-dd", чтобы я %DATE%равнялся ему "2012-02-18", и date /tвыдает тот же результат. (Это для Windows 7; я полагаю, то же самое для более ранних версий Windows.)

Создайте командный файл и затем выполните его.

Поскольку у вас есть команда GNU date, вы можете сделать что-то вроде этого:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat будет содержать что-то вроде:

zip some_options archive_2012-02-18.zip

Обратите внимание, что это создает tmp.batв текущем каталоге, что может быть проблемой; это может быть лучше для создания %TEMP%\tmp.bat. Я также не удалил файл позже; это достаточно легко сделать.

date +FORMATпозволяет указать формат вывода dateкоманды, аналогично printfстроке формата; подробности смотрите в документации по дате coreutils . Формат может включать произвольный текст, поэтому в этом случае вам даже не нужно его использовать sed.


1

Я полагаю, если вы соберете все вместе, вы получите то, что вам подходит. Это в системе Windows 2003, чтобы дать мне снимок запущенных процессов в ответ на триггер от монитора производительности:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

Выходной файл назван в одной строке без разделителей.


0
zip [...] archive_`echo %DATE% | tr / -`.zip

Должно сработать.

С другой стороны - возможно, у вас есть dateдоступная команда (я не знаю Windows). Если да, то просто сделайте:

zip [...] archive_`date +'%Y-%m-%d'`.zip

Уловка обратного удара не работает в cmd.exe. И команда Windows date не может обрабатывать форматирование :(
Кристи Диаконеску,

-1

не уверен, подходит ли вам это, но мой код

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

ОП хочет файл с текущей датой в имени файла , а не в содержимом файла
Ян Догген
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.