Просто конвертирую некоторые сценарии оболочки в командные файлы, и есть одна вещь, которую я, кажется, не могу найти ... и это простой подсчет количества аргументов командной строки.
например. если у вас есть:
myapp foo bar
В ракушке:
- $ # -> 2
- $ * -> foo bar
- $ 0 -> myapp
- $ 1 -> foo
- $ 2 -> бар
В партии
- ?? -> 2 <---- какая команда ?!
- % * -> foo bar
- % 0 -> myapp
- % 1 -> foo
- % 2 -> бар
Итак, я огляделся и либо смотрю не в том месте, либо я слепой, но, похоже, я не могу найти способ подсчитать количество переданных аргументов командной строки.
Есть ли команда, аналогичная "$ #" оболочки для командных файлов?
пс. самое близкое, что я нашел, - это перебрать% 1s и использовать shift, но мне нужно ссылаться на% 1,% 2 и т. д. позже в сценарии, так что это бесполезно.
shell
batch-file
scripting
Pyko
источник
источник
2 myapp foo bar
?Ответы:
Немного погуглив, вы получите следующий результат из викиучебников :
Похоже, cmd.exe немного эволюционировал из старых дней DOS :)
источник
for
работает только для аргументов, которые выглядят как имена файлов, а не для строк параметров, таких как-?
. Использование кавычек (for %%i in ("%*") ...
) работает для таких аргументов,-?
но снова не работает для цитируемых аргументов из-за вложенных кавычек. Единственный надежный способ, кажется, вовлечьshift
...MyBatchFile "*.*" "Abc"
сообщает, что argC == 9. - Проголосовали против.Вы склонны обрабатывать ряд аргументов с помощью такой логики:
и т.п.
Если у вас более 9 аргументов, то такой подход вас не устраивает. Существуют различные приемы для создания счетчиков, которые вы можете найти здесь , но имейте в виду, что они не для слабонервных.
источник
shift
для подсчета более 9 ... и без 10 строк одинаково выглядящего кода.Функция, указанная
:getargc
ниже, может быть тем, что вы ищете.Он в основном выполняет итерацию один раз по списку (который является локальным для функции, поэтому сдвиги не повлияют на список в основной программе), считая их до тех пор, пока он не закончится.
Он также использует изящный трюк, передавая имя возвращаемой переменной, которая будет установлена функцией.
Основная программа просто показывает, как его вызвать, а затем повторяет аргументы, чтобы убедиться, что они не затронуты:
источник
echo Count is %argc%
вы должны вставить свой собственный код, который может проверить правильность этого подсчета, а затем двигаться дальше.Попробуй это:
источник
Если количество аргументов должно быть точным числом (меньше или равно 9), то это простой способ проверить:
источник
Избегает использования одного
shift
или одногоfor
цикла за счет размера и удобочитаемости.Вывод:
РЕДАКТИРОВАТЬ: Используемый здесь «трюк» включает:
Создание строки, представляющей текущую вычисляемую переменную аргумента командной строки (например, «% 1», «% 2» и т. Д.) С использованием строки, содержащей символ процента (
%%
) и переменную счетчикаarg_idx
на каждой итерации цикла.Сохранение этой строки в переменной
curr_arg_label
.Передача и этой строки (
!curr_arg_label!
), и имени возвращаемой переменной (curr_arg_value
) в примитивную подпрограммуget_value
.В подпрограмме значение первого аргумента (
%1
) используется слева от assignment (set
), а значение второго аргумента (%2
) - справа. Однако, когда передается второй аргумент подпрограммы, он преобразуется в значение аргумента командной строки основной программы интерпретатором команд. То есть передается не, например, «% 4», а любое значение, которое содержит четвертая переменная аргумента командной строки («another_arg» в примере использования).Затем переменная, переданная подпрограмме как возвращаемая переменная (
curr_arg_value
), проверяется на неопределенность, что может произойти, если в настоящее время вычисленный аргумент командной строки отсутствует. Первоначально это было сравнение значения возвращаемой переменной, заключенного в квадратные скобки, с пустыми квадратными скобками (это единственный известный мне способ тестирования аргументов программы или подпрограммы, которые могут содержать кавычки и были пропущены после фазы проб и ошибок), но с тех пор было исправлено, как сейчас.источник
Последний ответ был два года назад, но мне нужна была версия для более чем девяти аргументов командной строки. Может быть, еще один ...
Решением являются первые 19 строк, которые преобразуют все аргументы в переменные в стиле c. Все остальное просто проверяет результат и показывает преобразование в локальные аргументы. Вы можете ссылаться на аргументы по индексу в любой функции.
источник
Надежным решением является делегирование подсчета подпрограмме, вызываемой с помощью
call
; подпрограмма используетgoto
операторы для имитации цикла, в которомshift
используется для итеративного использования аргументов (только для подпрограммы):источник