Сохранение символов "=" (равно) в параметрах пакетного файла

Я написал командный файл для запуска приложения (приложение не мое, я не могу его изменить). Сам пакетный файл принимает некоторые параметры. Приложение принимает другие параметры. Пакетный файл использует все свои параметры, используя 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 - это одна из самых полных реализаций, которые я видел. И гораздо более полный, чем другие ответы.