Сохранение символов "=" (равно) в параметрах пакетного файла
Я написал командный файл для запуска приложения (приложение не мое, я не могу его изменить). Сам пакетный файл принимает некоторые параметры. Приложение принимает другие параметры. Пакетный файл использует все свои параметры, используя SHIFT, затем запускает приложение с правильной средой и передает остальные параметры в приложение. Пример вызова командного файла:
script.bat -opt-1 -opt-2 /opt-a /opt-b=value
В этом примере "-opt-1" и "-opt-2" потребляются script.bat. В конце он должен вызывать исходное приложение с параметрами "/opt-a" и "/opt-b = value". Приложение "=" в последнем параметре ожидается приложением, я не могу его изменить. Он хорошо работает, когда я вызываю приложение непосредственно из командной строки.
Но когда я вызываю его из script, приложение получает 2 параметра для "/opt-b = value": "/opt-b" и "value". Если я использую "% *" при вызове приложения, знаки "=" сохраняются, но все параметры передаются (включая параметры, пропускаемые с помощью SHIFT).
Есть ли способ передать только последние параметры и сохранить знаки "=" ?
Ответы
Ответ 1
Назовите script.bat
следующим образом:
script.bat -opt-1 -opt-2 /opt-a "/opt-b=value"
и внутри script.bat
, вызовите приложение следующим образом:
rem Consume -opt-1
shift
rem Consume -opt-2
shift
rem Call the application
application %1 %~2
EDIT: ответ на комментарии
Ok. Давайте рассмотрим эту проблему подробно.
Файл script.bat ниже:
@echo off
rem Consume -opt-1
shift
rem Consume -opt-2
shift
rem Call the application
ECHO application %1 %~2
(пожалуйста, обратите внимание на команду ECHO
) правильно "вызовите" приложение со вторым параметром, включая знак равенства, когда его четвертый параметр заключен в кавычки, поскольку следующий вывод на экране показывает:
C:\> script.bat -opt-1 -opt-2 /opt-a "/opt-b=value"
application /opt-a /opt-b=value
Однако, если приложение IS A BATCH FILE, то оно страдает от той же проблемы с исходным файлом script.bat. Вы сказали, что "он работает хорошо, когда я вызываю приложение непосредственно из командной строки". Ну, это не так:
C:\> type application.bat
@echo off
rem ** application.bat **
echo 1: %1
echo 2: %2
echo 3: %3
echo 4: %4
C:\> application /opt-a /opt-b=value
1: /opt-a
2: /opt-b
3: value
4:
Параметры пакетного файла могут быть разделены запятой, точкой с запятой или равным знаком, кроме пробелов и вкладок. Таким образом, если "Признак" в последнем параметре ожидается приложением ", то нет никакого способа, чтобы приложение являлось Batch файлом и не имело смысла тестировать этот метод с пакетным файлом вместо приложения.
Вы протестировали это решение с помощью реального приложения?
Ответ 2
FOR /f "tokens=1*" %%x IN ("%*") DO ECHO application %%y
где 1
- количество пропущенных параметров.
Тестирование... main .bat
(q20572424.bat)
@ECHO OFF
SETLOCAL
ECHO master[%*]
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424a.bat %%y
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424a.bat %%y
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424a.bat %%x
GOTO :EOF
Дочернее предприятие .bat
(q20572424a.bat)
@ECHO OFF
SETLOCAL
ECHO slave=[%*]
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424b.bat %%y
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424b.bat %%y
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424b.bat %%x
GOTO :EOF
Второе вспомогательное .bat
(q20572424b.bat)
@ECHO OFF
SETLOCAL
ECHO subslave=[%*]
GOTO :EOF
Результаты:
От запуска q20572424 -opt-1 -opt-2 /opt-a /opt-b=value
master[-opt-1 -opt-2 /opt-a /opt-b=value]
slave=[/opt-a /opt-b=value]
subslave=[]
subslave=[/opt-b=value]
subslave=[/opt-a /opt-b=value]
slave=[-opt-2 /opt-a /opt-b=value]
subslave=[/opt-b=value]
subslave=[/opt-a /opt-b=value]
subslave=[-opt-2 /opt-a /opt-b=value]
slave=[-opt-1 -opt-2 /opt-a /opt-b=value]
subslave=[/opt-a /opt-b=value]
subslave=[-opt-2 /opt-a /opt-b=value]
subslave=[-opt-1 -opt-2 /opt-a /opt-b=value]
Что представляется правильным. В каждом случае вспомогательная партия получает параметры дословно; количество удаляемых ведущих параметров составляет 2,1,0 для каждого вызова.
W7HP - работает для меня!
Ответ 3
Посмотрите на: https://github.com/frossm/getopt.btm - это одна из самых полных реализаций, которые я видел. И гораздо более полный, чем другие ответы.
Ответ 4
Взято из https://blogs.oracle.com/quinn/a-little-trick-with-windows-bat-scripts-argument-processing-and-equals-signs
:recurse
for /F "tokens=1*" %%a in ("%*") do (
rem do something
...
if NOT x%%b==x call :recurse %%b
)