Командний рядок 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 Чи існує "однолінійний" спосіб позбутися простору чи інших неприємних символів? (на відміну від третьої ... n-ї тимчасової змінної для кожного символу для заміни)
Крісті Діаконеску,

Ні вибач. Здається, такого немає. Щоб зробити це, ви повинні відсидіти до синтаксису. 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 рядок замість кількох рядків у відповіді harrymc.

Цікава частина:

@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) залежить від ваших регіональних налаштувань. Оскільки я використовую французький формат дати (dd / mm / yyyy), я повинен використовувати "%% 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% 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 (.bat), щоб отримати поточну дату у форматі MMDDYYYY" ,
і, ймовірно, може бути адаптований до вашого випадку:

відлуння
у швидкій партії дати @REM Seamonkey (формат
MMDDYYYY ) @REM Налаштування змінної% date
@REM Перший аналіз місяця, дня та року в мм, dd, yyyy, а потім поєднується як MMDDYYYY

ДЛЯ / F “TOKENS = 1 * DELIMS =” %% A IN (‘DATE / T’) Встановіть CDATE = %% B
FOR / F “TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') DO SET mm = %% 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>

Тож можна робити заміни на місці! Якщо ви запитаєте мене, команда "за" має один дивний синтаксис ...
Крісті Діаконеску,

я не стверджував, що це не міг :) весь 'cmd' матеріал все одно божевільний, хто б не задумав, що був глибоко в якомусь поганому сні. cmd 'for' фактично створює рядки (він же 'розкручує' 'цикл') при першому проході, а потім виконує так створений сценарій.
akira

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.)

Створіть пакетний файл та виконайте його.

Оскільки 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рядка формату; Детальну інформацію див. у документації на дату основної інформації. Формат може містити довільний текст, тому в цьому випадку вам навіть не потрібно користуватися 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 "дата" не може працювати з форматуванням :(
Крісті Діаконеску,

-1

не впевнений, чи підходить вам, але мій код

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

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