it-swarm.com.ru

Пакет и команда

Я сжимаю файлы, используя 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?

59
Raj More

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

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

Для запроса Логана на тот же формат вывода для «даты и времени изменения» файла:

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 ожидает удвоения обратной косой черты и экранирования = (первый. Второй защищен окружающими кавычками).

54
Stephan

Извлеките час, ищите начальный пробел, если нашли, замените на ноль;

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
54
Alex K.

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

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

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

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

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

19
WxGuy

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

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

Это полный кошмар для программиста на BAT.

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

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

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

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

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

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

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%"

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

Если PM я получу 20160915_2150101.

8
Nesar

Вы можете добавить начальные нули к переменной (значение до 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

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

4
Vicky
@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, если запуск 4 февраля 2012

3
user1189773

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

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

Возможно, с Zip и 1980 это было хорошим решением, но сегодня вы должны использовать систему репозитория, такую ​​как Subversion или git или ..., но не Zip-файл.

Хорошо, может быть, я ошибаюсь.

2
jeb

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

Утверждено с французскими локальными настройками.

:::::::: 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
2
user2757848

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

Загрузите 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

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


Правка:

Быстрый поиск по переполнению стека заполнил последний кусок головоломки, Пакетный эквивалент обратных кавычек 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%

Производить:

20120904-114434

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

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

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

0
corlettk

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

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

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

0
Marty