Анализировать аргументы с помощью простого FOR небезопасно, поскольку он повредит аргументы, содержащие *
или ?
- он будет предполагать, что вы ищете файлы, и расширит аргумент во все файлы, соответствующие маске подстановочного знака.
Я также разделяю озабоченность Compo по поводу присвоения имени вашему пакетному файлу myexe.bat, даже если вы переименовали myexe.exe в другое. Лучше назвать ваш скрипт чем-то вроде myexeMulti.bat.
Я всегда использую GOTO l oop всякий раз, когда мне нужно надежно разобрать параметры, и я не могу контролировать их содержимое.
I Рекомендуется использовать параметр +
для разделения каждой группы параметров.
Ниже приведено надежное решение, которое всегда будет работать при условии:
- Вам никогда не нужно передавать
+
как параметр для myexe - Все параметры, содержащие символы-кавычки, заключены в кавычки
Часто люди проверяют, есть ли какие-либо аргументы, с помощью if "%~1" neq ""
, но этот тест ложно обрабатывает ""
в качестве аргумента Я веду себя консервативно и предполагаю, что вы, возможно, захотите передать ""
в качестве аргумента, поэтому я проверяю с помощью set arg=%1
, а затем проверяю, определен ли arg.
@echo off
setlocal
set "args="
:loop
set arg=%1
if defined arg (
if .%1==.+ (
myexe %args%
set "args="
) else (
set args=%args% %1
)
shift /1
goto loop
)
myexe %args%
exit /b
Если пользователь выполняет
myExeMulti /s1 /s2 "*" + + "abc" /s1 + "abc" /s1 /s2
тогда скрипт выполнит
myexe /s1 /s2 "*"
myexe
myexe "abc" /s1
myexe "abc" /s1 /s2