Как передать параметры в bat-файл
Обновлено: 21.11.2024
Передача параметров между пакетными файлами и приложениями командной строки (написанными на PHP или Perl) относительно проста. Передавая параметры из родительского приложения в дочернее, вы можете использовать либо переменные среды, либо включать параметры в командную строку, которая запускает приложение. При передаче параметров от дочернего элемента к родительскому либо используется промежуточный файл, либо используется пакетная команда «FOR /F» для обработки выходного текста от дочернего элемента.
На этой странице рассмотрено вышеизложенное и приведены примеры, которые можно использовать в пакетных файлах Uniform Server.
Фон
Родительский процесс передает свою среду дочернему процессу. Ребенок наследует только копию (моментальный снимок текущей среды) среды родителей. Это означает, что ребенок не может изменить исходную среду.
Хотя дочерний процесс может получать доступ к унаследованным переменным среды и изменять их, ему требуется механизм для передачи любых изменений обратно родительскому процессу. Одним из решений является запись новых или измененных переменных в файл. Родитель читает этот файл и при необходимости вносит изменения.
В качестве альтернативы дочерний элемент может выводить переменные в стандартный поток (например, print или echo использует стандартный поток для вывода на экран), позволяя родительскому элементу перехватывать и обрабатывать эти данные. Звучит сложно, однако команда FOR /F имеет встроенную функциональность, поэтому ее легко реализовать.
Передача переменных дочернему элементу
В этом примере демонстрируется передача переменных среды и параметров программы (приложения). Хотя в демонстрации используется только одна переменная среды и один параметр программы, вы не ограничены числом, которое вы можете передать приложению.
В папке UniServerZ создайте два новых файла с именами testp1.bat и testp1.php со следующим содержимым:
Код за пределами двух тестовых строк – это пакетный скрипт эталонного шаблона.
A) Пакетная команда "set var1=school1" устанавливает для доступной среды var1 значение school1.
Сценарий php testp1.php запускается с параметром school2
Тест
Запустите пакетный файл, дважды щелкнув файл test1p.bat, откроется командное окно.
- Подтвердите, что скрипт php выводит и отображает переменную среды (school1).
- Подтвердите, что скрипт php выводит и отображает параметр (school2).
Примечание 1: выходные данные PHP-скрипта отображаются, но не фиксируются, поэтому
не могут использоваться в пакетном файле. Это будет решено позже с помощью команды FOR /F.
Примечание 2. Сценарий PHP относительно короткий и может быть запущен непосредственно в виде одной строки
из пакетного файла, что устраняет необходимость в сценарии:
Замените следующую строку:
Обзор FOR /F
Команда FOR имеет множество параметров, к счастью, для извлечения переменных/параметров из приложения требуется только параметр /F.
Для этой опции существует три формата командной строки:
Примечание. Следующие определения: -
токены: строки, разделенные разделителями. Это строки, которые вы пытаетесь сопоставить. Примеры токенов показаны зеленым цветом.
разделители: символы, разделяющие токены. Примеры разделителей показаны красным.
токен, разделенный пробелами
больше токенов , через запятую , 12Z
filenameset — это одно или несколько имен файлов. Каждый файл открывается, читается и обрабатывается перед переходом к следующему файлу в наборе имен файлов.
Обработка заключается в чтении файла по одной строке за раз и последующем разбиении строки на отдельные элементы данных или «токены». Затем выполняется команда DO с параметром (параметрами), установленными на найденный маркер (ы).
По умолчанию /F передает первый разделенный пробелом токен из каждой строки каждого файла. Пустые строки пропускаются.
LiteralString Строка текста будет обрабатываться так же, как одна строка ввода команды.
Обработка LiteralString состоит из разбиения строки на отдельные элементы данных или «токены». Затем выполняется команда DO с параметром (параметрами), установленными на найденный маркер (ы).
Строка должна быть заключена в двойные кавычки.
command Выполняется названная команда вместе с любыми параметрами. Обработка команды состоит из считывания вывода команды по одной строке за раз и последующего разбиения строки на отдельные элементы данных или «токены». Затем выполняется команда DO с параметром (параметрами), установленными на найденный маркер (ы).
Ключевое слово | Описание |
eol= c | Определяет символ конца строки комментария (всего один символ) по умолчанию ";" |
skip=n | Указывает количество строк, которые необходимо пропустить в начале файла. |
delims=xxx | Указывает набор разделителей . Это заменяет набор разделителей по умолчанию, состоящий из пробела и табуляции. |
tokens=x,y,mn | Указывает, какие токены из каждой строки должны передаваться в тело for для каждой итерации . В результате выделяются дополнительные имена переменных. Форма m-n представляет собой диапазон, определяющий токены от m-го до n-го. Если последним символом в строке tokens= является звездочка (*), выделяется дополнительная переменная, которая получает оставшийся текст в строке после последнего проанализированного токена. |
usebackq | Указывает, что вы можете использовать кавычки для заключения имен файлов в кавычки в наборе имен файлов, строка в обратных кавычках выполняется как команда, а строка в одинарных кавычках является литеральной строковой командой.< /td> |
ДЛЯ /F передачи литеральной строки
Обработка строк для трех форматов командной строки FOR /F filenameset, LiteralString и command идентична. В этом разделе приведены примеры с использованием формата LiteralString в первую очередь потому, что вы видите, что текст обрабатывается и требуется только один файл, что упрощает эксперименты с параметрами команды форматирования.
В папке UniServerZ создайте новый файл с именем testp2.bat:
- Идентификатор персонажа, за которым следует краткое описание.
- Показать используемую командную строку.
- Отобразить ожидаемый результат.
- Фактический запуск командной строки FOR /F, отображает результаты с использованием захваченных токенов.
Примечание 1. Формат эха ..%%A..%%B..%%C.. выводит назначенные переменные %%A, %%B и %%C, заключенные между двумя полные остановки с обеих сторон. Эти точки включены для тестирования, помимо визуального разделения переменных, они позволяют увидеть любые захваченные неожиданные символы.
Примечание 2. Для переменных в команде FOR /F требуется начальный символ, например (%%A), начиная с этой начальной точки, дополнительные буквы назначаются в той последовательности, которая требуется для команды FOR. Для каждого захваченного токена создается переменная, которой присваивается значение токена. Если вы укажете в секции DO переменную, которая не была создана и которой не присвоено значение, вместо этого выводится ее имя.
Примечание 3. Формат LiteralString требует, чтобы строка была заключена в кавычки. Вы можете снова использовать переменные среды, они должны быть заключены в кавычки.
Примечание 4. В разделе ["options"] вы можете размещать параметры в любом порядке, однако рекомендуется размещать разделители в конце, поскольку это упрощает указание пробела, например "токены =1* разделители=, "
Тест
Запустите пакетный файл, дважды щелкнув файл test2p.bat, откроется командное окно.
FOR /F Передача набора имен файлов -1
Извлечение одного параметра в качестве первой строки файла, например пароля MySQL, достигается либо с помощью команды SET с оператором перенаправления, либо с помощью команды FOR /F с форматом набора имен файлов. Для сравнения показан пример обоих. Папки (ssl и www) можно защитить с помощью разрешенных пар имен пользователей и паролей, содержащихся в файле. Пароль пользователя можно извлечь с помощью команды FOR /F.
В папке UniServerZ создайте новый файл с именем testp3.bat:
Извлечение пароля MySQL с помощью команды SET:
A) Команда SET с параметром /p ожидает ввода пользователя. Этот ввод предоставляется из файла с использованием перенаправления
В пакетных файлах есть два типа переменных. Один для параметров, которые можно передать при вызове пакетного файла, а другой — с помощью команды set.
Аргументы командной строки
Пакетные сценарии поддерживают концепцию аргументов командной строки, при этом аргументы могут передаваться в пакетный файл при вызове. Аргументы можно вызывать из пакетных файлов через переменные %1, %2, %3 и т. д.
В следующем примере показан пакетный файл, который принимает 3 аргумента командной строки и выводит их на экран командной строки.
Если приведенный выше пакетный сценарий хранится в файле с именем test.bat и мы должны запустить пакет как
На снимке экрана показано, как это будет выглядеть в командной строке при выполнении пакетного файла.
Приведенная выше команда выводит следующий результат.
Если бы мы запускали пакет как
Вывод останется таким же, как указано выше. Однако четвертый параметр будет проигнорирован.
Установить команду
Другой способ инициализации переменных – это команда set. Ниже приведен синтаксис команды set.
Синтаксис
имя-переменной – это имя переменной, которую вы хотите установить.
значение — это значение, которое необходимо установить для переменной.
/A — этот переключатель используется, если значение должно быть числовым по своей природе.
В следующем примере показан простой способ использования команды set.
Пример
В приведенном выше фрагменте кода переменная с именем message определена и имеет значение "Hello World".
Чтобы отобразить значение переменной, обратите внимание, что переменная должна быть заключена в знак %.
Вывод
Приведенная выше команда выводит следующий результат.
Работа с числовыми значениями
В пакетном сценарии также можно определить переменную для хранения числового значения. Это можно сделать с помощью переключателя /A.
В следующем коде показан простой способ установки числовых значений с помощью переключателя /A.
Сначала мы устанавливаем значения двух переменных, a и b, равные 5 и 10 соответственно.
Мы добавляем эти значения и сохраняем в переменной c.
Наконец, мы отображаем значение переменной c.
Выход вышеуказанной программы будет равен 15.
Все арифметические операторы работают в пакетных файлах. В следующем примере показано, как арифметические операторы можно использовать в пакетных файлах.
Приведенная выше команда выводит следующий результат.
Локальные и глобальные переменные
В любом языке программирования есть возможность пометить переменные как имеющие какую-то область действия, то есть раздел кода, в котором к ним можно получить доступ. Обычно к переменной с глобальной областью можно получить доступ из любой точки программы, тогда как локальные переменные имеют определенную границу, в которой к ним можно получить доступ.
Сценарии DOS также имеют определения для локальных и глобальных переменных. По умолчанию переменные являются глобальными для всего сеанса командной строки. Вызовите команду SETLOCAL, чтобы сделать переменные локальными для области вашего скрипта. После вызова SETLOCAL любые назначения переменных возвращаются при вызове ENDLOCAL, вызове EXIT или когда выполнение достигает конца файла (EOF) в вашем сценарии. В следующем примере показана разница между локальными и глобальными переменными, установленными в скрипте.
Пример
Несколько ключевых моментов, на которые следует обратить внимание в отношении вышеуказанной программы.
"globalvar" имеет глобальную область действия и доступна во всем скрипте.
Переменная var определена в локальной области видимости, поскольку она заключена между блоками SETLOCAL и ENDLOCAL. Следовательно, эта переменная будет уничтожена, как только будет выполнен оператор ‘ENDLOCAL’.
Вывод
Приведенная выше команда выводит следующий результат.
Вы заметите, что команда echo %var% ничего не даст, потому что после оператора ENDLOCAL переменной var больше не будет существовать.
Работа с переменными среды
Если у вас есть переменные, которые будут использоваться в пакетных файлах, всегда предпочтительнее использовать переменные среды. Как только переменная среды определена, к ней можно получить доступ через знак %. В следующем примере показано, как увидеть JAVA_HOME, определенный в системе. Переменная JAVA_HOME — это ключевой компонент, который обычно используется в самых разных приложениях.
Вывод покажет каталог JAVA_HOME, который зависит от системы к системе. Ниже приведен пример вывода.
Мне нужно передать идентификатор и пароль пакетному файлу во время запуска, а не жестко записывать их в файл.
Вот как выглядит командная строка:
У меня есть сценарий запуска среды, который будет помещать мое имя пользователя/пароль в переменные среды. чтобы мне не приходилось их каждый раз вводить. Однако я использую bash большую часть времени (linux, mac и windows), и мне нужно использовать его для конфигураций прокси в сценариях и т. д. для работы.
20 ответов 20
Еще один полезный совет: используйте %* для обозначения "все". Например:
приведенный выше пакетный файл будет запущен:
Возможно, у меня немного неправильный синтаксис, но общая идея такова.
Обратите внимание, что %* работает не везде! Например, он не работает с DOSBox 0.73 (возможно, это ошибка, о которой следует сообщить).
Этот ответ неверен. На самом деле это приводит к поддельной команде /u admin /p password admin password foo bar . На это указал @Joey много лет назад.
Две смены в данном случае бессмысленны. ПОСЛЕ них %1 станет foo, а %2 станет bar, но это никак не используется, и %* не затрагивается командой shift
Вот как я это сделал:
Вот как выглядит команда:
%1 применяется к первому параметру, %2 (и здесь сложная часть) применяется ко второму. Таким образом можно передать до 9 параметров.
Если вы такой же тупой, как я, ваш разум искал эхо %1 %2 и был сбит с толку простейшим случаем без возможности вырезания и вставки с @ и фальшивой командой с параметрами, думая, что мы' d получить содержимое fake-command.bat позже (в этом случае чрезмерно сложный fake-command.bat может иметь echo %2 %4 для игнорирования имен параметров). Неправильно, тупица. TL;DR: Не будь таким тупым, как я. 1. эхо-эхо %1 %2 > test.bat 2. тест слово1 слово2 . 3. Прибыль.
Пять лет спустя я снова читаю свой комментарий с замешательством. Кажется, имелось в виду «создать файл .bat с двумя параметрами, буквально введите echo echo %1 %2 > test.bat . В файле test.bat будет эхо %1 %2 (вы также можете сохранить его из текстового редактора). Теперь введите test word1 word2 для вызова и посмотрите, как сработали параметры. слово1 слово2 будет выведено в командную строку. ( echo %2 %4 проигнорировал бы /u и /p , поэтому вы могли бы вызвать test /u word1 /p word2 для получения того же результата). @ перед cmd в файле bat означает, что cmd не повторяется.
Если вы хотите разумно обрабатывать отсутствующие параметры, вы можете сделать что-то вроде:
В основном, если %1 пусто, это будет IF . == . и поэтому GOTO произойдет. Мы используем x здесь так: IF x%1 == x -> IF x==x -> true
Вы должны спросить, какова ценность "непредоставленного аргумента"? Против чего вы должны проверить «непредоставленный аргумент»? Затем, если у вас нет ответа, вы должны использовать трюк, такой как одна из точек. Помните, что, как указано здесь ss64.com/nt/if.html, «на самом деле вы можете использовать практически любой символ для этого '~' или фигурные скобки, < > или даже цифру 4, но квадратные скобки, как правило, выбираются, потому что они не имеют особого значения."
Доступ к параметрам пакета может быть простым с помощью %1, %2, . %9 или также %*,
но только если содержимое простое.
Не существует простого способа для сложного содержимого, такого как "&"^& , поскольку невозможно получить доступ к %1 без возникновения ошибки.
Строки расширяются до
И каждая строка завершается ошибкой, так как один из & находится вне кавычек.
Проблему можно решить, прочитав из временного файла перемеченную версию параметра.
Хитрость заключается в том, чтобы включить эхо и расширить %1 после оператора rem (работает также с %2 .. %* ).
Таким образом, даже "&"& может быть отображено без ошибки, как это отмечено.
Но чтобы иметь возможность перенаправить вывод эха на , вам нужны два цикла for.
Затем внимательно читаем вывод параметра rem из файла.
FOR /F должен работать с выключенным отложенным расширением, в противном случае содержимое с "!" был бы уничтожен.
После удаления лишних символов в param1 у вас получилось.
А для безопасного использования param1 включите отложенное раскрытие.
@KevinEdwards Я проверял это, test.bat ^&, и оно не работает. Работает только test.bat "&", но я не об этом. Вы не можете использовать %* , %1 безопасным способом без технологии REM
Ах, да, знак вставки не экранирует его должным образом. Вам нужны цитаты, что возможно для всех случаев использования, с которыми я сталкивался. Я просто хотел передать это. Спасибо за тестирование! Здоровья :)
@jwdonahue Да, это сложно (но не слишком). Но особенно для паролей это может быть необходимо, по крайней мере, некоторые из моих паролей содержат амперсанды &, а также кавычки "
Да, и только не забудьте использовать такие переменные, как %%1, при использовании if и for и банды.
Если вы забудете двойной % , вы будете подставлять (возможно, нулевые) аргументы командной строки и получать довольно запутанные сообщения об ошибках.
Еще хуже то, что %% используется для префикса переменных и параметров командной строки внутри пакетных файлов. Но когда вы используете эти команды из командной строки, вы используете только префикс %. Пример: внутри пакета: для %%d в (*) выполните эхо %%d из командной строки: для %d в (*) выполните эхо %d
@SteveMidgley Я проголосовал за ваш комментарий, наверное, год назад или около того. Затем я быстро забыл об этом, и только сегодня я пытался и смущенно смотрел на мой цикл for в командной строке и задавался вопросом, почему он пукнул и больше ничего не делал. Итак, вот еще один виртуальный голос от меня. Я вернусь через год или около того, когда снова столкнусь с той же проблемой.
Обычно мы резервируем цифры для обработки командной строки, и, насколько мне известно, двойной процент применяется только к оператору for. @for %%2 in (тестирование) do @echo %%2 %1 в пакетном файле, производит тестирование 1 при вызове с 1 ( test 1 ).
Ответ неверный. %%1 не имеет доступа к аргументу командной строки, а также не подходит для команды IF. Только для команды FOR (в пакетных файлах) требуются двойные проценты, но даже в этом случае %%1 определяет параметр FOR и не имеет доступа к аргументам
Не нужно усложнять. Это просто команда %1 %2 параметров, например,
Пауза показывает, что сделал пакетный файл, и ждет, пока вы нажмете ЛЮБУЮ клавишу. Сохраните это как xx.bat в папке Windows.
Чтобы использовать его, введите, например:
Этот командный файл отвечает за все необходимые параметры, такие как копирование только более новых файлов и т. д. Я использовал его еще до появления Windows. Если вам нравится видеть имена копируемых файлов, не указывайте параметр Q.
Недавно друг спрашивал меня на эту тему, поэтому я решил опубликовать, как я обрабатываю аргументы командной строки в пакетных файлах.
Как вы увидите, этот метод имеет некоторые накладные расходы, но он делает мои пакетные файлы очень простыми для понимания и быстрыми в реализации. А также поддерживает следующие структуры:
Суть в том, что у него есть функции :init , :parse и :main.
%1 и %2 возвращают значения первого и второго аргумента соответственно.
И в командной строке передайте аргумент
Примечание: IF "%1"=="" вызовет проблемы, если %1 сам заключен в кавычки.
В этом случае вместо этого используйте IF [%1]==[] или, только в NT 4 (SP6) и более поздних версиях, IF "%~1"=="".
Давайте не будем усложнять.
Вот файл .cmd.
Вот 3 вызова из командной строки.
Это перебирает параметры пакета (%*), независимо от того, заключены они в кавычки или нет, а затем выводит каждый параметр.
Я написал простой скрипт read_params, который можно вызывать как функцию (или внешний .bat ) и помещать все переменные в текущую среду. Исходные параметры не будут изменены, поскольку функция вызывается с копией исходных параметров.
Например, для следующей команды:
myscript.bat сможет использовать переменные после вызова функции:
Вот функция:
Ограничения
- Невозможно загрузить аргументы без значения, например -force . Вы можете использовать -force=true, но я не могу придумать, как разрешить пустые значения, не зная заранее список параметров, которые не будут иметь значения.
Журнал изменений
- 18 февраля 2016 г.
- Больше не требуется отложенное развертывание.
- Теперь работает с другими аргументами командной строки, ища - перед параметрами.
Я рассматривал возможность использования этого метода, так как хотел бы передавать аргументы в пакетный файл таким образом. Однако я заметил, что после того, как переменные установлены, даже после выхода из командного файла параметры по-прежнему устанавливаются в cmd, если к ним обращаются, и пакет закончился, они не восстанавливаются до их предыдущего состояния. Должен ли этот метод обрабатывать эту ситуацию?
Расширен для поддержки аргументов флагов (без значений). Извините за отсутствие форматирования, но в комментариях это не работает :read_params если не %1/==/ ( если не "%__var%"=="" ( если не "%__var:~0,1%"== "-" ( endlocal перейти к read_params ) endlocal & set %__var:~1%=%~1 ) else ( setlocal & set __var=%~1 ) shift goto read_params ) else (если не "%__var%"=="" ( endlocal & set %__var:~1%=1 ))
Все отвечали очень сложными ответами, но на самом деле они очень простые. %1 %2 %3 и т. д. — аргументы, проанализированные в файл. %1 — аргумент 1, %2 — аргумент 2 и т. д.
Итак, если у меня есть скрипт bat, содержащий это:
и когда я запускаю пакетный скрипт, я набираю это:
Сценарий просто выведет это:
Это может быть очень полезно для определенных переменных в скрипте, таких как имя и возраст. Итак, если у меня есть такой скрипт:
Когда я набираю это:
Я получаю результат:
Вдохновленный ответом @Jon в другом месте, я разработал более общий алгоритм для извлечения именованных параметров, необязательных значений и переключателей.
Допустим, мы хотим реализовать утилиту foobar. Требуется начальная команда. У него есть необязательный параметр --foo, который принимает необязательный значение (которое, конечно, не может быть другим параметром); если значение отсутствует, по умолчанию используется значение по умолчанию. Он также имеет необязательный параметр --bar, который принимает обязательное значение. Наконец, он может принимать флаг --baz без разрешенного значения. Да, и эти параметры могут идти в любом порядке.
Другими словами, это выглядит так:
Вот решение:
- Используйте SETLOCAL, чтобы переменные не попали в вызывающую среду.
- Не забудьте инициализировать переменные SET FOO= и т. д. на случай, если кто-то определил их в вызывающей среде.
- Используйте %~1, чтобы удалить кавычки.
- Используйте IF "%ARG%" == "" , а не IF [%ARG%] == [], потому что [ и ] вообще не воспроизводятся со значениями, заканчивающимися пробелом.
- Даже если вы выполняете SHIFT внутри блока IF, текущие аргументы, такие как %~1, не обновляются, поскольку они определяются при анализе IF. Вы можете использовать %~1 и %~2 внутри блока IF, но это сбивает с толку, потому что у вас есть SHIFT. Вы можете поставить SHIFT в конце блока для ясности, но это может также запутать людей. Так что лучше "захватить" %~1 и %~1 вне блока.
- Вы не хотите использовать параметр вместо необязательного значения другого параметра, поэтому вам нужно проверить, ЕСЛИ НЕ "%ARG:~0,2%" == "--" .
- Нажимайте SHIFT только при использовании одного из параметров.
- Дубликат кода SET FOO=%DEFAULT_FOO% вызывает сожаление, но альтернативой может быть добавление IF "%FOO%" == "" SET FOO=%DEFAULT_FOO% вне IF NOT "%ARG%" == "" блокировать. Однако, поскольку это все еще находится внутри блока IF "%PARAM%" == "--foo", значение %FOO% будет вычислено и установлено до того, как вы войдете в блок, поэтому вы никогда не обнаружите, что оба присутствовал параметр --foo, а также значение %FOO% отсутствовало.
- Обратите внимание, что в ECHO отсутствует значение бара.1>&2 отправляет сообщение об ошибке в stderr.
- Хотите пустую строку в пакетном файле Windows? Вы должны использовать ECHO: или один из вариантов.
Чтобы сослаться на установленную переменную в командной строке, вам нужно будет использовать %a%, например:
Примечание. Это работает для Windows 7 pro.
Чтобы использовать зацикливание, получите все аргументы в чистом пакетном режиме:
Obs: Для использования без: ?*&|<>
Ваш код готов что-то сделать с номером аргумента там, где это необходимо, например.
Создайте новый пакетный файл (пример: openclass.bat) и напишите в нем эту строку:
Затем поместите пакетный файл, скажем, в папку system32, перейдите к файлу класса Java, щелкните правой кнопкой мыши, Свойства, Открыть с помощью. затем найдите пакетный файл, выберите его и все.
Это работает для меня.
PS: я не могу найти способ закрыть окно cmd при закрытии класса Java. Пока.
Вы можете закрыть окно cmd после закрытия процесса, используя следующую команду в пакетном сценарии: start /wait java %~n1
Советовать публике размещать случайные файлы сценариев в каталоге system32 безответственно. Этот ответ действительно не касается темы этой ветки.
Простое решение (хотя вопрос старый)
Где YourLocalPath — текущий путь к каталогу.
Для простоты сохраните параметр команды в переменной и используйте переменную для сравнения.
Его не только просто написать, но и легко поддерживать, поэтому, если позже какой-то другой человек или вы прочитаете ваш сценарий спустя долгое время, его будет легко понять и поддерживать.
Чтобы написать встроенный код: см. другие ответы.
Парные аргументы
Если вы предпочитаете передавать аргументы в виде пары "ключ-значение", вы можете использовать что-то вроде этого:
Предопределенные переменные
Вы также можете заранее установить некоторые переменные среды. Это можно сделать, установив их в консоли или установив их с моего компьютера:
и назвав это так:
Файл с перечисленными значениями
Вы также можете указать файл, в котором предварительно заданы необходимые значения. Если это скрипт:
и файл значений таков:
результатом вызова будет:
Конечно, вы можете комбинировать все подходы. Проверьте также синтаксис аргументов, сдвиг
Если вы беспокоитесь о безопасности или краже пароля (что привело вас к разработке этого решения, которое использует учетные данные для входа в систему при выполнении вместо статического жесткого кодирования без необходимости в базе данных), вы можете сохранить API или половину кода. расшифровки пароля или ключа расшифровки в файле программы, поэтому во время выполнения пользователь будет вводить имя пользователя/пароль в консоли для хэширования/расшифровки перед передачей в программный код для выполнения через set /p , если вы смотрите на ввод учетных данных пользователя во время выполнения.
Если вы запускаете скрипт для запуска вашей программы с разными пользователями/паролями, вам подойдут аргументы командной строки.
Если вы создаете тестовый файл для просмотра результатов/эффектов различных входов в систему, вы можете сохранить все входы в систему в зашифрованном файле, который будет передан в качестве аргумента в test.cmd, если вы не хотите сидеть в командной строке. и введите все логины, пока не закончите.
Количество аргументов, которые можно указать, ограничено общим количеством символов в командной строке. Чтобы обойти это ограничение, можно использовать трюк из предыдущего абзаца, не рискуя раскрытием паролей пользователей.
Аргумент (или параметр) командной строки – это любое значение, переданное в пакетный скрипт:
C:> MyScript.cmd Январь 1234 "Некоторое значение"
Аргументы также можно передать подпрограмме с помощью CALL:
ЗВОНИТЕ: my_sub 2468
Вы можете получить значение любого аргумента, используя %, за которым следует числовая позиция в командной строке. Первый передаваемый элемент всегда %1, второй элемент всегда %2 и т. д.
%* в пакетном скрипте относится ко всем аргументам (например, %1 %2 %3 %4 %5 . %255)
по номеру можно ссылаться только на аргументы от %1 до %9.Если передаваемый аргумент содержит пробелы, заключите его в двойные кавычки.
Если есть шанс, что аргумент может быть NULL или строкой нулевой длины, заключите его в двойные кавычки. Это обеспечит согласованность номеров параметров (%1 %2 и т. д.).Расширения параметров
%~p1 Расширить %1 только до пути, например. \utils\ включает завершающий символ \, который некоторыми командами интерпретируется как escape-символ.
%~n1 Разверните %1 до имени файла без расширения файла или пути — MyFile
или, если присутствует только путь, без косой черты в конце, до последней папки в этом пути.%~x1 Расширить %1 только до расширения файла - .txt
%~s1 Измените значение f , n , s и x, чтобы они ссылались на короткое имя 8.3 (если оно существует).
%~a1 Показать атрибуты файла %1
%~t1 Показать дату/время %1
%~z1 Показать размер файла %1
%~$PATH:1 Найдите переменную среды PATH и замените %1 на полное имя первого найденного совпадения.
Вышеуказанные модификаторы можно комбинировать:
%~dp1 Развернуть %1 только до буквы диска и пути
%~sp1 Развернуть %1 до пути, сокращенного до 8,3 символов
%~nx2 Развернуть %2 только до имени файла и расширения
Эти переменные параметра/аргумента всегда обозначаются одним ведущим %
Это отличается от обычных переменных, которые имеют как начальный, так и конечный %, таких как %variable% или переменные команды FOR, которые используют один начальный % в командной строке или двойной %% в начале при использовании в пакетном файле.При использовании в составе команды FOR в пакетном файле требуются два символа %:
Set _file=C:\Program Files\SS64\Demo.exe
Для %%G in ("%_file%") DO echo Диск=%%~dG Path=%%~pG Name=% %~nG Ext=%%~xGРасширение параметра будет рассматривать точку в имени каталога как расширение файла, поэтому для такого имени, как «Образец 2.6.4», вывод %~n1 будет усечен до «Образец 2.6», чтобы вернуть полное имя папки. используйте %1 или %~nx1
Если выходные данные DIR или имя файла без буквы/пути к диску расширены для отображения полного имени пути %~f1, командная оболочка примет это; часто неправильно; что файл находится в текущем каталоге. Оболочка CMD не читает файловые дескрипторы и не работает с объектами файловой системы так, как это делает PowerShell, она обрабатывает простой список текстовых строк.
При написании пакетных сценариев рекомендуется сохранять значения в именованной переменной SET _LogFile=%~dp1 , тогда остальная часть сценария может ссылаться на легко читаемое имя переменной %_LogFile%. жизнь проще, если позже вам понадобится изменить порядок параметров.
Токенизация
Токенизация аргументов командной строки не всегда выполняется оболочкой cmd.exe. Чаще всего токенизация выполняется средой выполнения вновь сформированных процессов, на уровне ОС Windows передает командную строку без токенизации в виде одной строки новому процессу. Вы можете прочитать больше о низкоуровневых деталях пакетного языка/cmd, ускользающих от превосходных ответов jeb и dbenham на этот вопрос StackOverflow.
Передача по ссылке
В дополнение к передаче числовых или строковых значений в командной строке также можно передать имя переменной, а затем использовать эту переменную для передачи данных между сценариями или подпрограммами. Передача по ссылке — это немного более продвинутый метод, но он может быть необходим, если строка содержит символы, являющиеся разделителями CMD или кавычками. В противном случае передача строки типа Начало и середина:"и & Конец может что-то сломать. .
Перетаскивание
Если вы перетащите один или несколько файлов или папок в пакетный файл, пакет будет выполнен, и имена файлов (или имена папок) будут переданы пакетному файлу в качестве аргументов:
% 1 = "первый файл", %2 = "второй файл" и т. д.
Как и при перетаскивании файла в окно CMD, к длинным именам автоматически добавляются кавычки.
Если вам нужно перетащить более 9 файлов, используйте команду SHIFT.Ссылки, относящиеся к пакетному скрипту
Вы можете получить путь к самому пакетному скрипту с помощью %0 , к нему можно применить расширения параметров, поэтому %~dp0 вернет диск и путь к пакетному скрипту, например. W:\scripts\ и %~f0 вернут полный путь W:\scripts\mybatch.cmd
Вы можете ссылаться на другие файлы в той же папке, что и пакетный скрипт, используя следующий синтаксис: p>
Это можно использовать даже в подпрограмме, Echo %0 даст метку вызова, а echo "%~nx0" даст вам имя файла пакетного сценария.
Когда % 0 расширяется, результат заключен в кавычки.
Используйте %~a1 для отображения расширенных атрибутов файла.
%%~aI FOR распознает 9 атрибутов файла NTFS. Расширение атрибута файла создает серию из 9 тире, где каждый распознанный атрибут заменяет тире буквой. Файл без распознанных атрибутов или без набора атрибутов будет расширен до 9 тире, например: ---------
Другие атрибуты NTFS, не распознанные %%~aI, можно прочитать с помощью FSUTIL usn команда:
FILE_ATTRIBUTE_ENCRYPTED
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_SPARSE_FILEПример: Расширение файла с атрибутами Hidden и System:
---hs----< /p>Максимальная длина строки
Максимальная длина любой командной строки (или переменной) в CMD составляет 8191 символ.
Терминология: аргумент командной строки или параметр?
С точки зрения математики, параметр – это "числовой или другой измеримый фактор", поэтому обычно это число.
В терминологии программирования:
Параметр представляет собой значение, которое процедура ожидает от вас при ее вызове.
Аргумент представляет фактическое значение, которое вы передаете процедуре.На практике фразы аргумент и параметр часто используются взаимозаменяемо. , пакетные файлы CMD не выполняют проверку типов.
ДЛЯ параметров
Команда FOR создает переменные параметров, которые обозначаются буквой, а не цифрой (например, %%G ).
Описанные выше расширения параметров также могут быть применены к ним.
Чтобы избежать путаницы между двумя наборами букв, избегайте использования букв (a, d, f, n, p, s, t, x, z) в качестве параметров FOR или просто выберите букву параметра FOR, которая является ЗАГЛАВНОЙ. кейс.
Например, в такой ссылке, как %%~fG, %%G – это параметр FOR, а ~f – расширение параметра.Передача параметров из одного пакета в другой:
Или в рамках ЗВОНКА:
Получите размер файла C:\demo\sample.xlsx, используя расширение параметра %~z:
Передача значений из одной части скрипта в другую:
"Я пришел сюда, чтобы поспорить. Нет, ты не пришел, ты пришел сюда, чтобы поспорить" ~ Монти Пайтон
Читайте также: