Как передать несколько параметров в пакетный файл Windows или в пакетную функцию? - PullRequest
0 голосов
/ 10 июня 2018

Я хочу передать %DownParameters% и %URL% для функции :myWGET в коде ниже, сохраненном в пакетном файле с именем abc.bat.

set DownParameters="--continue --wait=5 --no-check-certificate --retry-connrefused --tries=30 -blah -blah"
set URL=https://someip/a.zip

call :myWGET %DownParameters% %URL%

:myWGET
wget.exe %1 %2
REM what i expected is wget.exe %DownParameters% %URL%
goto:eof

Однако это не работает из-запробелы в %DownParameters%.

Обходной путь использует %DownParameters% непосредственно в :myWGET, но это не нужно.

Как передать аргументы в %DownParameters% и %URL% для работы :myWGET для использования в wget.exe командной строке?

[обновление 1]

с помощью set "DownParameters=--no-check-certificate --wait=30 --tries=1 --retry-connrefused --header="Connection: close""

--header="Connection: close" все еще вызовет проблемы, когда

Call :myWGET "%DownParameters%" "%URL%"

echo %~1 в :myWGET показать

--no-check-certificate --wait=30 --tries=1 --retry-connrefused --header="Connection:, отсутствует «закрытие», что нужно экранировать?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Подобно тому, что уже отвечено, все зависит от правильного цитирования.

Set "DownParameters=--continue --wait=5 --no-check-certificate --retry-connrefused --tries=30 -blah -blah"
Set "URL=https://someip/a.zip"

Call :myWGET "%DownParameters%" "%URL%"
Rem Any other commands here
GoTo :EOF

:myWGET
WGet %~1 %2
GoTo :EOF

В команде Call пары двойных кавычек охватывают каждый параметр / аргумент.В команде WGet ~ раскрывает каждую метавариативную переменную, удаляя все заключенные в двойные кавычки.

0 голосов
/ 10 июня 2018

Сначала посмотрите на ответы по Почему нет строкового вывода с 'echo% var%' после использования 'set var = text' в командной строке? и Как установить переменные средыс пробелами? Эти ответы очень подробно объясняют разницу между set "variable=value" и set variable="value".

Рабочий код:

set "DownParameters=--continue --wait=5 --no-check-certificate --retry-connrefused --tries=30 -blah -blah"
set "URL=https://someip/a.zip"

call :myWGET %DownParameters% "%URL%"
goto :EOF

:myWGET
for %%I in (%*) do if /I "%%~I" == "STOP" exit /B 1
echo wget.exe %*
wget.exe %*
goto :EOF

A FOR loopили FINDSTR может использоваться для выхода из подпрограммы, если какой-либо аргумент, переданный подпрограмме, нечувствителен к регистру слова STOP.

for %%I in (%*) do if /I "%%~I" == "STOP" exit /B 1

Цикл FOR обрабатывает каждый аргумент в списке аргументов и запускает IF для простого сравнения строк без учета регистра, при котором двойные кавычки удаляются из строки аргумента перед сравнением со словом STOP.

echo %* | %SystemRoot%\System32\findstr.exe /I /R "\<STOP\>" >nul 2>&1 && exit /B 1

ECHO перенаправляет список аргументов одной строкой в ​​ FINDSTR , который ищет слово STOP без учета регистра. FINDSTR завершается кодом выхода 0, если слово действительно найдено, и в этом случае командный процессор Windows выполняет команду EXIT .В противном случае FINDSTR заканчивается на 1, указывая, что искомая строка не найдена, и поэтому командный процессор Windows продолжает выполнение следующей командной строки в пакетном файле.Вывод FINDSTR для обработки STDOUT и STDERR подавляется путем перенаправления его на устройство NUL по мере необходимости.

Цикл FOR лучше, на мой взгляд, лучше сравнивать целые строки аргументов без или с заключенными в них двойными кавычками, разделенными одним или несколькими пробелами.

Для понимания используемых команд и их работы,откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... объясняет также %*
  • echo /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...