Дата и время пакетной команды в имени файла - PullRequest
63 голосов
/ 11 октября 2011

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

Я использую следующее для создания имени файла.Скопируйте и вставьте его в командную строку, и вы увидите имя файла с компонентом Date and Time.

echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.zip

Вывод

Archive_20111011_ 93609.zip

Однако моя проблема AM против вечера .Отметка времени AM дает мне время 9 (с начальным пробелом) против 10, естественно занимающего два пробела.

Полагаю, моя проблема будет распространяться и на первые девять дней, первые 9 месяцев и т. Д.

Как это исправить, чтобы вместо начальных пробелов были добавлены начальные нули,Я получаю Archive_20111011_093609.zip?

Ответы [ 12 ]

0 голосов
/ 14 октября 2016

Пробел допустим в именах файлов. Если вы поместите свой путь и имя файла в кавычки, он может просто летать. Вот что я использую в командном файле:

svnadmin hotcopy "C:\SourcePath\Folder" "f:\DestPath\Folder%filename%"

Не имеет значения, есть ли пробелы в% filename%.

0 голосов
/ 04 сентября 2012

Я понимаю, что это спорный вопрос к ФП, но я просто заварил это, и я немного горжусь тем, что мыслил нестандартно.

Скачать gawk для Windows на http://gnuwin32.sourceforge.net/packages/gawk.htm .... Тогда это одна строка, без всего этого неуклюжего синтаксиса пакета DOS, где требуется шесть циклов FOR для разделения строк (WTF ? Это действительно очень плохо и плохо! ... ИМХО конечно)

Если вы уже знаете, C, C ++, Perl или Ruby, то подбор AWK (который наследует от первых двух и вносит значительный вклад в последние два) - это часть общеизвестного пирога! !!

Пакетная команда DOS:

echo %DATE% %TIME% && echo %DATE% %TIME% | gawk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}"

Печать:

Tue 04/09/2012 10:40:38.25
20120904-104038

Теперь это не совсем полная история ... Я просто буду ленивым и жестко закодирую остальную часть моего лог-файла в выражении printf, потому что это просто ... Но если кто-нибудь знает, как чтобы установить переменную% NOW% для вывода AWK (получая смелость «универсальной» функции now), тогда я - все уши.


EDIT:

Быстрый поиск по переполнению стека, заполнивший последний фрагмент головоломки, Пакетный эквивалент обратных черт Bash .

Итак, эти три строки пакета DOS:

echo %DATE% %TIME% | awk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}" >%temp%\now.txt
set /p now=<%temp%\now.txt
echo %now%

Produce:

20120904-114434

Так что теперь я могу включить datetime в имя файла журнала, созданного моим сценарием установки SQL Server (2005+), таким образом:

sqlcmd -S .\SQLEXPRESS -d MyDb -e -i MyTSqlCommands.sql >MyTSqlCommands.sql.%now%.log

И я снова счастливый путешественник (за исключением того, что жизнь в SOOOOO была намного проще в Unix).

...