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 и использовать ее для создания имени файла?

13 ответов13

27

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

set _date=%DATE:/=-%
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"

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

2

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

эхо на
@REM Seamonkey - быстрый пакет с датами (формат MMDDYYYY)
@REM Setups% переменная даты
@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>
1

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

@echo data =% CDate%

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

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

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

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

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

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

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

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 .

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .