我想将%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:
,缺少“关闭”,需要转义哪些内容?
答案 0 :(得分:1)
首先,查看Why is no string output with 'echo %var%' after using 'set var = text' on command line?和How to set environment variables with spaces?上的答案。这些答案非常详细地解释了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
如果传递给子例程的任何参数对单词STOP
不区分大小写,则 FOR 循环或 FINDSTR 可用于退出子例程。
for %%I in (%*) do if /I "%%~I" == "STOP" exit /B 1
FOR 循环处理参数列表中的每个参数并运行 IF 以进行简单的不区分大小写的字符串比较,从而在与word进行比较之前从参数字符串中删除双引号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命令处理器继续使用批处理文件中的下一个命令行。处理 STDOUT 和 STDERR 的 FINDSTR 的输出通过将其重定向到设备 NUL 来抑制,因为不需要。< / p>
FOR 循环在我看来更好,因为真正比较整个参数字符串没有或用一个或多个空格分隔的用双引号括起来。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
...也解释%*
echo /?
findstr /?
for /?
goto /?
if /?
set /?
另见:
答案 1 :(得分:1)
与已经回答的类似,这都是正确引用的问题。
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
命令中, ~
会扩展每个元变量,从而删除包含双引号的元变量。