Я хотел бы найти пакетный аналог Windows для Bash, $@
который содержит список всех аргументов, переданных в скрипт.
Или я должен беспокоиться shift
?
источник
Я хотел бы найти пакетный аналог Windows для Bash, $@
который содержит список всех аргументов, переданных в скрипт.
Или я должен беспокоиться shift
?
У dancavallaro это правильно, %*
для всех параметров командной строки (за исключением самого имени скрипта). Вы также можете найти их полезными:
%0
- команда используется для вызова пакетного файла (может быть foo
, ..\foo
, c:\bats\foo.bat
и т.д.)
%1
является первым параметром командной строки,
%2
является вторым параметром командной строки,
и так далее , пока %9
(и SHIFT
может быть использован для тех , кто после 9 - го).
%~nx0
- фактическое имя пакетного файла независимо от вызывающего метода (some-batch.bat)
%~dp0
- диск и путь к сценарию (d: \ scripts)
%~dpnx0
- это полное имя пути сценария (d: \ scripts \ some -batch.bat)
Дополнительные примеры информации на https://www.ss64.com/nt/syntax-args.html и https://www.robvanderwoude.com/parameters.html
%~dpn0
что вернет диск и путь к сценарию плюс имя пакетного файла, но не расширение. Я нашел это особенно полезным при создании пакетных сценариев, которые вызывают.ps1
файл с тем же именем. По сути,d
относится к диску,p
относится к пути,n
относится к имени файла иx
относится к расширению. С этой информацией вы можете сделать довольно много.@echo %~n0.my_ext
%*
кажется, содержит все аргументы, переданные сценарию.источник
&
? Когда я пытаюсь получить несколько путей к нескольким выбранным файлам (используя меню «Отправить» и «% *», которые передают аргументы в .py), он останавливает листинг в & caracters. Так, если, например, второй файл содержит&
в своем имени&
&
специальный символ, который означаетstop this command and start another one
. Имя файла, содержащее&
ДОЛЖНО быть заключено в кавычки.%1
...%n
и%*
содержит аргументы, но получить к ним доступ может быть сложно, потому что контент будет интерпретирован.Поэтому с такими заявлениями невозможно справиться
Каждая строка завершается неудачно, поскольку cmd.exe пытается выполнить один из амперсандов (содержимое% 1 равно
"&"&
)Но существует обходной путь с временным файлом
Хитрость заключается в том, чтобы включить
echo on
и развернуть оператор%1
послеrem
(работает также с% 2 ..% *).Но чтобы иметь возможность перенаправить вывод
echo on
, вам нужны два цикла FOR-LOOPS.Дополнительные символы
* #
используются для обеспечения безопасности содержимого/?
( например , для справки по REM).Или символ ^ в конце строки может работать как многострочный символ.
FOR / F должен работать с отложенным расширением, иначе содержимое с "!" будет уничтожен.
После удаления лишних символов
param1
и у вас это получилось.И для
param1
безопасного использования включите отложенное расширение.Изменить: одно замечание к% 0
%0
содержит команду, используемую для вызова пакета, также сохраняя регистр, как вFoO.BaT
Но после вызова функции,
%0
а также в%~0
содержит имя функции (или лучше строку, которая использовалась для вызова функции).Но с
%~f0
вами еще можно вспомнить имя файла.Вывод
источник
%~f0
уловка совершенно неожиданная, крутая и потенциально очень полезная :-) Неудивительно, что другие модификаторы работают одинаково, всегда работая с родительским пакетным файлом, даже в вызываемой подпрограмме. Это кажется достойным его собственных вопросов и ответов - «Как получить доступ к имени запущенного пакета в вызываемой подпрограмме?»Я обнаружил, что в следующий раз, когда вам нужно найти эту информацию. Вместо того, чтобы открывать браузер и гуглить, вы можете просто ввести
call /?
свой cmd, и вы получите его:источник
Способ получить все аргументы скрипта здесь:
источник
%%I
получить интерпретацию и может сломать ваш сценарий.Вот довольно простой способ получить аргументы и установить их как env vars. В этом примере я буду ссылаться на них как на ключи и значения.
Сохраните следующий пример кода как «args.bat». Затем вызовите пакетный файл, который вы сохранили из командной строки. пример: arg.bat --x 90 --y 120
Я предоставил несколько эхо-команд, чтобы пройти через весь процесс. Но конечный результат заключается в том, что --x будет иметь значение 90, а --y будет иметь значение 120 (то есть, если вы запустите пример, как указано выше ;-)).
Затем вы можете использовать условный оператор if if, чтобы определить, следует ли запускать кодовый блок. Допустим, запустим: «arg.bat --x hello-world». Тогда я мог бы использовать выражение «IF DEFINED --x echo% - x%», и в результате получился бы «hello-world». Это должно иметь больше смысла, если вы запустите пакет.
источник
Obs: Для использования без:
?*&<>
источник
Следующий код имитирует массив ('
params
') - принимает параметры, полученные скриптом, и сохраняет их в переменныхparams_1
..params_n
, гдеn
=params_0
= количество элементов массива:источник
Если в кавычках есть параметры, содержащие пробелы,
%*
они не будут работать правильно. Лучшее решение, которое я нашел, - это создать цикл, объединяющий все аргументы: https://serverfault.com/a/22541.источник
Ты можешь использовать
For
Commad, чтобы получить список Arg.Помощь:
For /?
Помощь:Setlocal /?
Вот мой путь =
Не нужна команда Shift.
источник
источник
Большая часть информации, приведенной выше, привела меня к дальнейшим исследованиям и, в конечном итоге, к моему ответу, поэтому я хотел поделиться тем, что я делал, в надежде, что это поможет кому-то еще:
Я также хотел передать переменное количество переменных в пакетный файл, чтобы они могли быть обработаны в файле.
Я был в порядке с передачей их в командный файл, используя кавычки
Я хотел бы, чтобы они обрабатывались аналогично приведенному ниже - но с использованием цикла вместо записи вручную:
Поэтому я хотел выполнить это:
И с помощью цикла for сделайте это внутри командного файла:
У меня была проблема, что все мои попытки использовать цикл for не работали. Пример ниже:
просто сделал бы:
и не:
даже после настройки
Причина была в том, что цикл for прочитал всю строку и назначил мой второй параметр %% B во время первой итерации цикла. Поскольку% * представляет все аргументы, обрабатывается только одна строка - поэтому происходит только один проход цикла for. Это по замыслу оказывается, и моя логика оказалась неверной.
Поэтому я перестал пытаться использовать цикл for и упростил то, что пытался сделать, используя операторы if, shift и goto. Согласен, это немного взломать, но это больше подходит для моих нужд. Я могу перебрать все аргументы, а затем использовать оператор if, чтобы выйти из цикла, как только обработаю их все.
Заявление о победе за то, что я пытался сделать:
ОБНОВЛЕНИЕ - вместо этого мне пришлось изменить приведенное ниже, я выставлял все переменные среды, пытаясь сослаться на% 1 и используя shift таким образом:
источник
Иногда мне нужно извлечь несколько параметров командной строки, но не все и не из первого. Давайте предположим следующий вызов:
Конечно, расширение ".bat" не нужно, по крайней мере, у вас есть test.exe в той же папке. Мы хотим получить вывод «tres cuatro cinco» (независимо от того, одна строка или три). Цель состоит в том, что только мне нужны три параметра, начиная с третьего. Чтобы иметь простой пример, действие для каждого из них просто «эхо», но вы можете подумать о некоторых других более сложных действиях над выбранными параметрами.
Я привел несколько примеров (вариантов), чтобы вы могли увидеть, какой из них вы считаете лучшим для вас. К сожалению, нет хорошего (или я не знаю о) способа, основанного на цикле for в диапазоне, таком как «for %% i in (% 3, 1,% 5)».
Вероятно, вы можете найти больше вариантов или объединить несколько. Наслаждайся ими.
источник
Версия для Windows (требуется socat, хотя)
настройка:
источник