当我将以=符号结尾的参数传递给批处理文件时,遇到了问题。请考虑以下情况(>是Windows XP提示符):
> type c.bat
echo %1
> c.bat bla=
bla
> c.bat "bla="
"bla="
为什么在
bla=
中等号=
被忽略了?我该如何在参数中传递等号=
符号?当我将以=符号结尾的参数传递给批处理文件时,遇到了问题。请考虑以下情况(>是Windows XP提示符):
> type c.bat
echo %1
> c.bat bla=
bla
> c.bat "bla="
"bla="
bla=
中等号=
被忽略了?我该如何在参数中传递等号=
符号?这是一个已知的问题:http://support.microsoft.com/kb/35938
您可以通过以下方式绕过此问题:
SET ARG1=bla= && your.bat && SET ARG1=
和你的.bat文件:
@ECHO OFF
ECHO %ARG1%
或者你可以将其作为引号参数传递(使用""将其括起来):
your.bat "bla="
然后在批处理文件中按如下方式使用:
echo %~1
~
只是删除引号。阅读文档:
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true
“以下特殊字符需要加引号:& < > [ ] { } ^ = ; ! ' + , ` ~ [white space]”
%~1
参数来去除引号。我已经将其编辑到另一个答案中,因为原始作者显然不知道这一点。 - Joey您可以使用
your.bat "bla="
------ your.bat ----
echo %~1
或者也可以
your.bat bla=
------ your.bat ----
echo %*
最佳解决方案取决于具体情况。
详细描述请见:
call /?
%~
修饰符稍后删除引号。set "param1=%~1"
使用了%~1
会在存在引号时删除它们的事实。"param1=%~1"
周围的引号确保特殊字符不会产生错误。call :myFunc "<Hard>=&|"
exit /b
:myFunc
setlocal EnableDelayedExpansion
set "param1=%~1"
echo(!param1!
exit /b
但是如果参数中包含引号,仍然可能会出现问题。
call :myFunc "&"^&""
%*
的替代方案 - 现在,对于只有一个参数的“批处理函数”,我可以使用call:my_function_label %my_var_with_ugly_chars
,并在函数中引用%*
,其中我需要函数标签后面的部分(它是“所有参数”,就像bash的$*
一样,对吗?)。 - Tomasz Gandorcall :myFunc "<>~=;"
并通过 set "myVar=%~1"
扩展更容易且更安全。 - jeb这样可以吗?
如果tem.cmd包含
@echo off
set param=%1
set param=%param:"=%
echo %param%
然后
c:\> tem.cmd "hi="
提供
hi=
echo %~1
的效果与此相同 :-) - Joey
%~1
进行“取消引用”是关键,当您想通过call :my_function_label "%my_var_with_ugly_chars"
将某些内容传递给函数时 - 如果没有引号,您将得到参数的第一个标记作为%1
,而使用引号,则需要删除引号。 - Tomasz Gandor