Разработать пакетный файл для установки даты и времени параметры в командной строке
в Windows, Как получить доступ к аргументам, переданным при запуске пакетного файла?
например, предположим, у меня есть программа с именем hello.bat . Когда я войду hello -a в командной строке Windows, как я могу сообщить моей программе, что -a был передан в качестве аргумента?
как уже говорили другие, параметры передаются через командную строку можно найти в пакетных файлах с пометкой %1 to %9 . Есть также два других токена, которые вы можете использовать:
- %0 is имя исполняемого файла (пакетного файла), указанное в командной строке.
- %* is все параметры, указанные в командной строке -- это очень полезно, если вы хотите переслать параметры другому программа.
есть также много важных методов, чтобы быть в курсе в дополнение к просто как получить доступ к параметрам.
Модификаторы командной строки
С пакетными параметрами можно также использовать модификаторы. Модификаторы используют информацию о текущем диске и каталоге как часть или полное имя файла или каталога. Для использования модификатора напечатайте символ (%), затем символ тильды (~), а затем соответствующий модификатор (т.е., %~модификатор).
В следующей таблице описаны модификторы, используемые для расширения.
Модификатор | Описание |
---|---|
%~1 | расширение %1 и удаление любых кавычек ("") |
%~f1 | замена %1 полным путем |
%~d1 | замена %1 именем диска |
%~p1 | замена %1 путем |
%~n1 | замена %1 именем файла |
%~x1 | замена %1 расширением имени файла |
%~s1 | замена путем, содержащим только короткие имена |
%~a1 | Замена %1 атрибутами файла |
%~t1 | замена %1 датой и временем модификации файла |
%~z1 | замена %1 размером файла |
%~$PATH:1 | поиск в каталогах, перечисленных в переменной среды PATH, замена %1 полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку. |
В следующей таблице даны возможные комбинации модификаторов и квалификаторов для получения более сложных результатов.
обработка более 9 аргументов (или просто облегчение жизни)
Если вам нужно получить доступ к более чем 9 аргументов, вы должны использовать команду SHIFT . Эта команда сдвигает значения всех аргументов на одно место, так что %0 принимает значение %1 , %1 принимает значение %2 , etc. %9 принимает значение десятого аргумента (если он присутствует), который не был доступен через любая переменная перед вызовом SHIFT (введите команду SHIFT /? дополнительные параметры).
SHIFT также полезно, когда вы хотите легко обрабатывать параметры, не требуя, чтобы они были представлены в определенном порядке. Например, скрипт может распознавать флаги -a и -b в любом порядке. Хороший способ разбора командной строки в таких случаях
эта схема позволяет анализировать довольно сложные командные строки без безумный.
замена параметров партии
для параметров, представляющих имена файлов, оболочка предоставляет множество функций, связанных с работой с файлами, которые не доступны каким-либо другим способом. Эта функциональность доступна с конструкциями, которые начинаются с %~ .
например, чтобы получить размер файла, переданного в качестве аргумента, используйте
чтобы получить путь к каталогу, из которого был запущен пакетный файл (очень полезно!) вы можете использовать
вы можете просмотреть полный спектр этих возможностей путем ввода CALL /? в командной строке.
использование параметров в пакетных файлах: %0 и %9
пакетные файлы могут ссылаться на слова, переданные в качестве параметров с помощью маркеров: %0 до %9 .
параметры, передаваемые в командной строке, должны быть буквенно-цифровыми и разделены пробелами. С %0 это имя программы, как оно было вызвано, в DOS %0 будет пустым для AUTOEXEC.BAT, если запущен при загрузке время.
пример:
поместите следующую команду в пакетный файл с именем mybatch.bat :
вызов пакетного файла следующим образом: mybatch john billy выводит:
получите более 9 параметров для пакетного файла, используйте:%*
знак звезды процента %* означает "остальные параметры". Вы можете использовать цикл for для их захвата, как определено здесь:
Примечания о разделителях для параметров пакета
некоторые символы в параметрах командной строки игнорируются пакетными файлами в зависимости от версии DOS, являются ли они "экранированными" или нет, и часто в зависимости от их местоположения в командной строке:
пакетные файлы автоматически передают текст после программы, если они являются переменными для их назначения. Они передаются в порядке, в котором они отправляются, например, %1 станет первой строкой отправлено после того, как программа называется и т. д.
Если у вас есть Здравствуйте.летучая мышь и содержимое:
и вы вызываете пакет в команде через
Привет, APerson241 спасибо за запуск этого пакетного файла (01/11/2013)
использовать переменные, т. е. .BAT переменные и называется %0 to %9
@Джон :parse / :endparse схема-отличное начало, и у него есть моя благодарность за первоначальный проход, но если вы думаете, что мучительная пакетная система Windows позволит вам так легко. ну, мой друг, вы находитесь в шоке. Я провел целый день с этой дьявольщиной, и после многих болезненных исследований и экспериментов мне наконец удалось что-то жизнеспособное для реальной полезности.
предположим, что мы хотим реализовать программу foobar . Это требует начального команда. Он имеет необязательный параметр --foo С дополнительно значение (которое, конечно, не может быть другим параметром); если значение отсутствует, оно по умолчанию равно default . Он также имеет необязательный параметр --bar что происходит требуются значение. Наконец он может взять флаг --baz не допускается значения. О, и эти параметры могут быть в любом порядке.
другими словами, это выглядит так:
сложно? Нет, это довольно типично для реальной жизни. ( git кого?)
без дальнейших церемоний, вот решение:
отвратительно. Большую часть этого мне пришлось выучить сегодня. И это было больно.
я сжимаю файлы с помощью WinZip в командной строке. Поскольку мы архивируем ежедневно, я пытаюсь добавить дату и время в эти файлы, чтобы каждый раз автоматически создавался новый.
я использую для создания имени файла. Скопируйте вставьте его в командную строку, и вы увидите имя файла с компонентом даты и времени.
однако, моя проблема AM vs PM. Штамп времени AM дает мне время 9 (с ведущим пробелом) против 10 естественно, занимая два места.
Я думаю, что моя проблема будет распространяться на первые девять дней, первые 9 месяцев и т. д. также.
это немного сложнее, потому что он работает только с полными путями, wmic ожидает, что обратные косые черты будут удвоены и = должен быть спасен (первый. Второй защищен окружающие цитаты).
извлеките час, найдите начальное пространство, если найдено заменить на ноль;
вы должны искать, вы можете просто заменить все пробелы с нуля set hr=%hr: =0% -джеб 11 октября в 14: 16
затем использовать %hr% внутри любой строки форматировании всегда получит двузначное час.
(комментарий Джеба под самым популярным ответом работал лучше всего для меня и является самым простым. Я перепечатываю его здесь, чтобы сделать его более очевидным для будущего пользователи.)
как уже указала Вики, %DATE% и %TIME% верните текущую дату и время, используя короткие форматы даты и времени, которые полностью (бесконечно) настраиваются.
один пользователь может настроить свою систему для возврата Fri040811 08.03 PM в то время как другой пользователь может выбрать 08/04/2011 20:30.
это полный кошмар для программиста BAT.
изменение формата на формат фирмы может устранить проблему, если вы восстановите предыдущий формат до оставляя файл BAT. Но это может быть предметом неприятных условий гонки и усложнить восстановление в отмененных файлах BAT.
к счастью, есть альтернатива.
вместо этого вы можете использовать WMIC. WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table возвращает дату и время неизменным способом. Очень удобно непосредственно анализировать его с помощью .
Итак, собирая кусочки вместе, попробуйте это в качестве отправной точки.
Я нашел лучшее решение для меня, прочитав все ваши ответы:
Если я получу 20160915_ 150101 (с ведущим пространством и временем).
Если PM я получу 20160915_2150101 .
Вы можете добавить ведущие нули к переменной (значение до 99) как это в партии: IF 1%Var% LSS 100 SET Var=0%Var%
поэтому вам нужно разобрать компоненты даты и времени на отдельные переменные, обработать их все так, а затем объединить их вместе, чтобы создать имя файла.
однако, ваш базовый метод для парсинга даты и времени зависит от региональных настроек системы. Если вы рады, что ваш код не переносится на другие машины, это, вероятно, нормально, но если вы ожидайте, что он будет работать в разных международных контекстах, тогда вам понадобится другой подход, например, зачитав параметры реестра:
(этот последний контролирует, есть ли начальный ноль по времени, но не даты, насколько я знаю).
это занимает MB5L.txt и сжимает его до ziptest20120204.zip, если запустить 4 февраля 2012
ваш вопрос, кажется, решен, но .
Я не уверен, что вы принимаете правильное решение для своей проблемы.
Я полагаю, вы пытаетесь сжимать каждый день фактический код проекта.
это возможно с ZIP и 1980 это было хорошее решение, но сегодня вы должны использовать систему репозитория, как subversion или git или . но не zip-архив.
хорошо, возможно, я ошибаюсь.
из ответа выше я сделал готовую к использованию функцию.
проверено с французскими локальными параметрами.
Я понимаю, что это спорный вопрос для ОП, но я только что заварил это, и я немного горжусь собой за то, что мыслил нестандартно.
если вы уже знаете C, с++, Perl, или Руби, затем собирание на awk (который наследует от первых двух и вносит значительный вклад в последние два) - это кусок пресловутого пирога.
команда пакета DOS:
принты:
теперь это не совсем полная история. Я просто буду ленивым и жестко закодирую остальную часть моего имени файла журнала в инструкции printf, потому что это просто. Но если кто-нибудь знает как установите переменную %NOW% в выход AWK (yeilding кишки "универсальной" функции now), тогда я все уши.
EDIT:
быстрый поиск по переполнению стека заполнил этот последний кусок головоломки,пакетный эквивалент bash backticks.
Итак, эти три строки пакета DOS:
Итак, теперь я могу включить datetime в имя файла журнала произведенный моей установкой SQL Server (2005+) скрипт таким образом:
и я снова счастливый турист (за исключением того, что жизнь все еще была намного проще в Unix).
пробел является законным в именах файлов. Если вы поместите свой путь и имя файла в кавычки, он может просто летать. Вот что я использую в пакетном файле:
в пакетном скрипте Windows (Windows XP) мне нужно отформатировать текущую дату и время для последующего использования в именах файлов и т. д.
Это похоже на вопрос переполнения стека как добавить дату в пакетные файлы, но со временем.
у меня это до сих пор:
есть ли способ, которым я могу разрешить однозначный час в %TIME%, чтобы я мог получить следующее?
Я закончил с этим скриптом:
:: на WIN2008R2, например, мне нужно было сделать ваш " установить месяц=%дата:~3,2%", как показано ниже :: в противном случае 00 появляется в течение месяца
Если PowerShell установлен, то вы можете легко и надежно получить дату / время в любом формате, например:
конечно, в настоящее время PowerShell всегда установлен, но в Windows XP вы, вероятно, захотите использовать этот метод, только если ваш пакетный скрипт используется в известной среде, где вы знаете, что PS доступен (или проверьте свой пакетный файл, если PowerShell доступен. )
вы можете разумно спросить: зачем вообще использовать пакетный файл, если вы можно использовать PowerShell для получения даты / времени, но я думаю, что некоторые очевидные причины: (a) вы не так хорошо знакомы с PowerShell и по-прежнему предпочитаете делать большинство вещей старомодным способом с пакетными файлами или (b) вы обновляете старый скрипт и не хотите переносить все это в PS.
я столкнулся с этой проблемой сегодня и решил ее с помощью:
Он заменяет пробелы на 0s и в основном нулевые колодки в час.
после некоторого быстрого поиска я не узнал, требуются ли расширения команд (все еще работал с SETLOCAL DISABLEEXTENSIONS).
Я обычно делаю так, когда мне нужна дата/время:
Это для немецкого формата даты/времени (dd.мм гггг чч: мм: СС). В основном я объединяю подстроки и, наконец, заменяю все пробелы нулями.
краткое объяснение того, как работают подстроки:
таким образом, чтобы получить только год от даты, как "29.03.2018" использовать:
Как уже отмечалось, разбор даты и времени полезен только в том случае, если вы знаете формат, используемый текущим пользователем (например, MM/dd/yy или dd-MM-yyyy просто назвать два). Это может быть определено, но к тому времени, когда вы сделаете все стресс и разбор, вы все равно окажетесь в ситуации, когда используется неожиданный формат, и потребуется больше настроек.
вы также можете использовать некоторую внешнюю программу, которая вернет date slug в предпочтительном формате, но это имеет недостатки необходимости распространять служебную программу с вашим скриптом / пакетом.
есть также пакетные трюки с использованием часов CMOS довольно сырым способом, но это слишком близко к голым проводам для большинства людей, а также не всегда предпочтительное место для получения даты/времени.
ниже-это решение, которое позволяет избежать вышеуказанных проблем. Да, это вводит некоторые другие проблемы, но для моих целей я нашел это самым простым, ясным, самым портативным решением для создание метки данных .bat файлы для современных систем Windows. Это всего лишь пример, но я думаю, вы увидите, как изменить для других форматов даты и/или времени и т. д.
следующее Может быть не прямым ответом, а близким?
по крайней мере, это может быть вдохновляющим.
Если вам точно не нужен этот формат:
тогда вы можете использовать следующее 3 строки кода который использует %date% и %time%:
Примечание: символы / и : удаляются и символ . и Пробел заменяется знаком подчеркивания.
пример вывода (взято в среду 8/5/15 в 12: 49 вечера с 50 секундами и 93 миллисекундами):
на offset:length форматирование поддерживается с SET команда в Windows не позволит вам заполнить 0 как вы, кажется, заинтересованы.
однако вы можете закодировать пакетный скрипт, чтобы проверить, что час меньше 10 и
pad соответственно с другим echo строку.
вы также можете перейти на другие методы программирования, чтобы добраться сюда.
это довольно просто в unix bash (доступно с Cygwin на Windows), чтобы просто сказать,
Эта тема родилась почти два года назад. Нам потребовалось самыми простыми средствами ТОЛЬКО командной строки получит временной слепок в формате ГГГГММДД_ччммсс (Год, Месяц, День, часы, минуты, секунды). В дальнейшем этот слепок предполагалось использовать в именах файлов для предотвращения путаницы в создаваемых однотипных файлах. Решение было найдено и использовалось некоторое время (решение опубликовано в виде статьи Подстановка текущих даты/времени в имя файла стандартными средствами командной строки Windows).
Впоследствии обнаружилась незавершенность алгоритма - ночное и утреннее время (промежуток между 00:00 и 10:00) в зависимости от региональных настроек может содержать ведущий пробел вместо нуля (" 9:59" вместо "09:59"). Для исправления этой ошибки была добавлена одна строка, и алгоритм заработал вновь.
Примерно через год возникла необходимость вернуться к этому алгоритму, и был найден более простой вариант решения проблемы - подстановки даты и времени в имя файла. Появилась заметка Дата и время в имени файла (подстановка стандартными средствами командной строки Windows). В заметке описывается суть нового алгоритма, использующего особенности метода раскрытия переменных и свойства конструкции for /f. Рассмотрим каждый из них в отдельности. В конце будет показан еще один пример использования этой методики.
Недостатки
Вначале хотелось бы сказать о существующих недостатках. Есть одна особенность, о которой следует помнить. Этот скрипт хорошо работает даже с таким форматом даты как М/Д/ГГГГ, например для даты 14 февраля 2010. Однако это никогда не проверялось, например, для дат неделей раньше. Об этом сказано в записи от 14 февраля 2009 на странице архива Роба ван дер Вуда. Однако в большинстве случаев это работает.
Раскрытие переменных
Конструкции вида %VAR:str1=str2% указывают интерпретатору раскрыть значение переменной VAR и произвести замену всех подстрок str1 на str2 во всей строке. Это хорошая особенность, которой мы можем воспользоваться - переменная %TIME% может содержать ненужный нам ведущий пробел и нам необходимо заменить его нулем
В данном случае str1 - это пробел, str2 - символ "ноль". Поэтому между двоеточием и знаком равенства один пробел. На всякий случай аналогичное проделываем и с переменной DATE.
Конструкция for /f
В зависимости от региональных настроек порядок элементов даты может варьироваться. Например, у нас принят формат ДД.ММ.ГГГГ, в некоторых англоговорящих странах ММ.ДД.ГГГГ. Для решения нашей проблемы надо выбрать каждую часть времени и отсортировать в нужном нам порядке - разбить строку на части по разделителям (точка ".", пробел " ", слеш "/", запятая ",", тире "-", двоеточие ":"), полученные части записать в переменные цикла и сохранить в нужном нам порядке
Рассмотрим, как же эта конструкция поможет нам. for /f рассматривает входной поток (текстовая строка. файл на диске или вывод команды). В данном случае это строка, например дата и время создания этой темы 21.01.2010 21:48:50,23 (согласно настроек на моей системе). Эта строка анализируется и разбивается разделителями на отдельные фрагменты (токены).
Обратите внимание на пробел в списке разделителей - "/-. ". Так как входная строка содержит только целочисленную информацию, разделенную разделителями, то в строке всего 7 токенов.
Для того чтобы все токены были переданы внутрь цикла указываем количество и список токенов - "tokens=1-7", то есть все семь - с первого по седьмой. Чтобы все семь токенов попали в цикл на обработку будут выделено семь переменных цикла. В заголовке цикла указано имя первой переменной %%a. Следующие переменные получат последовательно имена %%b, %%c, %%d, %%e, %%f, %%g. В первую переменную %%a попадет первый токен, во вторую, %%b - второй токен, и т.д.
И так. В этом примере порядок следующий (работает на моем компьютере, у вас может быть другой)
-- %%a - день
-- %%b - месяц
-- %%c - год
-- %%d - часы
-- %%e - минуты
-- %%f - секунды
-- %%g - сотые
Так как время 21.01.2010 21:48:50,23 из формата ДД.ММ.ГГГГ чч:мм:сс,сд надо перевести в формат ГГГГММДД_ччмм, надо взять значения переменных из списка выше в следующем порядке
-- %%c - год
-- %%b - месяц
-- %%a - день
-- %%d - часы
-- %%e - минуты
В результате получим строку вида 20100121_2148.
Этот скрипт не универсальный, он системно-зависимый: порядок отдельных частей даты и времени зависит от текущих установок на компьютере (национальные, пользовательские настройки).
Aнализ текущего времени
На форуме был задан вопрос как проанализировать текущее время:
. нужно в процессе выполнения скрипта проанализировать текущее время, если текущее время меньше 15:00 , то пропускаем (по goto) определённую строку (блок).
Используем раскрытие переменных с заменой подстроки - берем значение переменной TIME, производим замену пробела нулем и полученную строку сравниваем с заданной строкой времени. Так как сравнение производится лексикографически (википедия), то алгоритм выполнится корректно
В процессе написания сложных пакетных файлов или же манипуляций с командной строкой многие вещи можно упростить. Одним из способов такого упрощения - является использование параметров и модификаторов, о которых и пойдет речь в статье.
Параметры командной строки
Пакетные параметры командной строки используются в пакетном файле для получения информации о настройках среды.
Файл Cmd.exe разворачивает переменные с %0 по %9. При использовании пакетных параметров переменная %0 заменяется на имя пакетного файла, а переменные с %1 по %9 — на соответствующие аргументы, напечатанные в командной строке. Для доступа к переменным больше %9 запустите команду shift. Для получения дополнительных сведений о команде shift смотрите раздел Shift. Параметр %* ссылается на все аргументы, которые передаются пакетному файлу, за исключением параметра %0.
Например, для копирования содержимого из папки 1 (Folder1) в папку 2 (Folder2), где параметр %1 заменяется на значение Folder1, а параметр %2 — на значение Folder2, в пакетном файле с именем Mybatch.bat введите следующую строку:
Для запуска файла введите:
Результат будет таким же, как и при записи в пакетный файл строки:
проверка, если параметр был передан
это делается с помощью конструкции типа IF "%~1"=="" , что верно, если и только если аргументы не были переданы вообще. Обратите внимание на символ тильды, который заставляет любые окружающие кавычки удаляться из значения %1 ; без Тильды вы получите неожиданные результаты, если это значение включает двойные кавычки, включая возможность синтаксических ошибок.
проверка, если параметр был передан
это делается с помощью конструкции типа IF "%~1"=="" , что верно, если и только если аргументы не были переданы вообще. Обратите внимание на символ тильды, который заставляет любые окружающие кавычки удаляться из значения %1 ; без Тильды вы получите неожиданные результаты, если это значение включает двойные кавычки, включая возможность синтаксических ошибок.
Читайте также: