Как известно, в bat файле оператор % позволяет получить только девять параметров командного файла:
echo %9
Считать значения десятого и последующих параметров тоже можно.
Сдвиг параметров командой SHIFT
Команда SHIFT
Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.
Команда SHIFT
сдвигает нумерацию параметров, так что под теми же номерами %0-%9 оказываются уже параметры с первого по десятый.
Последующие вызовы SHIFT
сдвигают параметры ещё дальше: со второго по одиннадцатый, затем с третьего по двенадцатый и т.д.
echo arg9=%9 shift echo arg10=%9 shift echo arg11=%9 shift echo arg12=%9 shift echo arg13=%9
В итоге bat файл успешно определяет и десятый параметр, и все остальные:
arg9=value9 arg10=value10 arg11=value11 arg12=value12 arg13=
При сдвиге дальше последнего параметра %9 возвращает пустое значение, в данном случае это 13-й параметр. Это позволяет определить, когда параметры закончились.
Сдвиг заданного числа параметров
Чтобы не двигать все параметры, у команды SHIFT
есть специальный ключ:
SHIFT /n
Команда SHIFT при включении расширенной обработки команд поддерживает ключ /n, задающий начало сдвига параметров с номера n, где n может быть от 0 до 9.
Например, в следующей команде:
SHIFT /2
%3 заменяется на %2, %4 на %3 и т.д., а %0 и %1 остаются без изменений.
То есть можно указать, чтобы сдвигались не все параметры.
Включение расширенной обработки команд
Делается командой SETLOCAL ENABLEEXTENSIONS
:
Пакетная команда SETLOCAL принимает необязательные аргументы:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
Это позволяет включить или отключить расширенную обработку команд.
Эти аргументы переопределяют параметры CMD /E:ON или /E:OFF. Для
получения дополнительных сведений введите CMD /?.
Как видно из справки, расширенную обработку команд можно включить также через CMD /E:ON
Разбор командной строки
Этот способ получения параметров основан на чтении всей строки параметров %*
в цикле FOR
:
for %%A in (%*) do ( echo %%A )
Этот способ взят с StackOverflow.
Если добавить в цикл сохранение параметров, то можно сохранить все параметры в переменные с номерами:
setlocal enabledelayedexpansion set /a arg_number=1 for %%a in (%*) do ( set arg!arg_number!=%%a set /a arg_number=!arg_number!+1 ) echo arg1=%arg1% echo arg10=%arg10% echo arg11=%arg11%
Вывод:
arg1=value1 arg10=value10 arg11=value11
Другой вариант присваивания значений — сразу в цикле:
setlocal enabledelayedexpansion set /a arg_number=1 for %%a in (%*) do ( echo arg_!arg_number!=%%a if !arg_number! == 1 set filename=%%a if !arg_number! == 2 set directory=%%a rem ... if !arg_number! == 11 set computer_name=%%a set /a arg_number=!arg_number!+1 ) echo filename=%filename%