Дата и время пакетной команды в имени файла



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



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



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 vs PM. Отметка времени AM дает мне время 9 (с ведущим пробелом) против 10 естественно, занимая два места.



Я думаю, что моя проблема будет распространяться на первые девять дней, первые 9 месяцев и т. д. также.



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

877   11  

11 ответов:

другое решение:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I

это даст вам (независимо от настроек локали!):

  20130802203023.304000+120
( YYYYMMDDhhmmss.<milliseconds><always 000>+/-<timedifference to UTC>  )

отсюда легко:

set datetime=%datetime:~0,8%-%datetime:~8,6%
20130802-203023

для запроса Логана на тот же outputformat для "дата-время изменения" файла:

for %%F in (test.txt) do set file=%%~fF
for /f "tokens=2 delims==" %%I in ('wmic datafile where name^="%file:\=\%" get lastmodified /format:list') do set datetime=%%I
echo %datetime%

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

извлеките час, найдите ведущее пространство, если найдено заменить на ноль;

set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%hr%%time:~3,2%%time:~6,2%.zip

вы должны искать, вы можете просто заменить все пробелы с нуля set hr=%hr: =0% -джеб11 октября '11 в 14: 16

так я и сделал:

set hr=%time:~0,2%
set hr=%hr: =0%

затем использовать %hr% внутри любой строки вы форматируете, чтобы всегда получить двузначный час.

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

как уже указывала Вики,%DATE% и %TIME% возвращает текущую дату и время, используя короткий формат даты и времени, которые полностью (бесконечно) настраиваемый.

один пользователь может настроить свою систему для возврата Fri040811 08.03 PM, а другой пользователь может выбрать 08/04/2011 20: 30.

это полный кошмар для программиста летучей мыши.

изменение формата на твердый формат может устранить проблему, если вы восстановите предыдущий формат раньше оставив файл летучей мыши. Но он может подвергаться неприятным условиям гонки и усложнять восстановление в отмененных файлах BAT.

к счастью, есть альтернатива.

вместо этого вы можете использовать WMIC. WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table возвращает дату и время в неизменном виде. Очень удобно сразу разобрать его с помощью .

Итак, собирая кусочки вместе, попробуйте это в качестве отправной точки...

SETLOCAL enabledelayedexpansion
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
  SET /A FD=%%F*1000000+%%D*100+%%A
  SET /A FT=10000+%%B*100+%%C
  SET FT=!FT:~-4!
  ECHO Archive_!FD!_!FT!.zip
 )

Я нашел лучшее решение для меня, прочитав все ваши ответы:

set t=%date%_%time%
set d=%t:~10,4%%t:~7,2%%t:~4,2%_%t:~15,2%%t:~18,2%%t:~21,2%
echo hello>"Archive_%d%"

Если я получу 20160915_ 150101 (с ведущим пространством и временем).

Если я 20160915_2150101.

Вы можете добавить ведущие нули к переменной (значение до 99) как это в партии: IF 1%Var% LSS 100 SET Var=0%Var%

таким образом, вам нужно будет разобрать ваши компоненты даты и времени на отдельные переменные, обработать их все так, а затем объединить их вместе, чтобы создать имя файла.

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

HKEY_CURRENT_USER\Control Panel\International\iDate
HKEY_CURRENT_USER\Control Panel\International\iTime
HKEY_CURRENT_USER\Control Panel\International\iTLZero

(этот последний контролирует, есть ли ведущий ноль по времени, но не даты, насколько я знаю).

@For /F "tokens=1,2,3,4 delims=/ " %%A in ('Date /t') do @(

Set DayW=%%A

Set Day=%%B

Set Month=%%C


Set Year=%%D


Set All=%%D%%B%%C
)
"C:\Windows\CWBZIP.EXE" "c:\transfer\ziptest%All%.zip" "C:\transfer\MB5L.txt"

это занимает MB5L.txt и сжимает его до ziptest20120204.zip if run on 4 Feb 2012

Ваш вопрос, кажется, решен, но ...

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

это возможно с ZIP и 1980 это было хорошее решение ,но сегодня вы должны использовать систему репозитория, как subversion или git или... но не zip-архив.

хорошо, возможно, это может быть, что я ошибаюсь.

из ответа выше, я сделал готовую к использованию функцию.

проверено с французскими локальными параметрами.

:::::::: PROGRAM ::::::::::

call:genname "my file 1.txt"
echo "%newname%"
call:genname "my file 2.doc"
echo "%newname%"

echo.&pause&goto:eof
:::::::: FUNCTIONS :::::::::

:genname
    set d1=%date:~-4,4%
    set d2=%date:~-10,2%
    set d3=%date:~-7,2%
    set t1=%time:~0,2%
    ::if "%t1:~0,1%" equ " " set t1=0%t1:~1,1%
    set t1=%t1: =0%
    set t2=%time:~3,2%
    set t3=%time:~6,2%
    set filename=%~1
    set newname=%d1%%d2%%d3%_%t1%%t2%%t3%-%filename%
goto:eof

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

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

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

команда DOS Batch:

echo %DATE% %TIME% && echo %DATE% %TIME% | gawk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", , , , , , );}"

принты:

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

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


EDIT:

быстрый поиск по переполнению стека заполнил эту последнюю часть головоломки,пакетный эквивалент bash backticks.

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

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

производим:

20120904-114434

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

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

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

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

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

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

Comments

    Ничего не найдено.