在Windows批处理文件中将'='传递给参数

3

当我将以=符号结尾的参数传递给批处理文件时,遇到了问题。请考虑以下情况(>是Windows XP提示符):

> type c.bat
echo %1

> c.bat bla=
bla

> c.bat "bla="
"bla="

为什么在bla=中等号=被忽略了?我该如何在参数中传递等号=符号?
4个回答

7

这是一个已知的问题:http://support.microsoft.com/kb/35938

您可以通过以下方式绕过此问题:

SET ARG1=bla= && your.bat && SET ARG1=

和你的.bat文件:

@ECHO OFF
ECHO %ARG1%

或者你可以将其作为引号参数传递(使用""将其括起来):

your.bat "bla="

然后在批处理文件中按如下方式使用:

echo %~1

在这种情况下,~ 只是删除引号。

1
通过 %~1 进行“取消引用”是关键,当您想通过 call :my_function_label "%my_var_with_ugly_chars" 将某些内容传递给函数时 - 如果没有引号,您将得到参数的第一个标记作为 %1,而使用引号,则需要删除引号。 - Tomasz Gandor

2

谢谢!但是这只是说=有问题,但没有说明具体发生了什么(Windows没有抱怨命令有任何问题),也没有说明我如何传递bla=。 - Hans-Peter Störr
您可以将参数用引号括起来来传递 blah=,就像您上一个示例中那样。 - Foo Bah
不太对 - 我传递的是"bla=",包括引号,而不仅仅是我想要的bla=。但是另一个答案表明实际上没有解决方案。 - Hans-Peter Störr
@hstoerr:在批处理中,您可以使用带有%~1参数来去除引号。我已经将其编辑到另一个答案中,因为原始作者显然不知道这一点。 - Joey
@Foo Bah那正是我尝试但未能成功完成的。8-) 我可以通过"bla="(包括引号),但无法通过bla=。 - Hans-Peter Störr
显示剩余3条评论

1

您可以使用

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 Gandor
@TomaszGandor 是的,但使用 call :myFunc "<>~=;" 并通过 set "myVar=%~1" 扩展更容易且更安全。 - jeb

0

这样可以吗?

如果tem.cmd包含

@echo off
set param=%1
set param=%param:"=%
echo %param%

然后

c:\> tem.cmd "hi="

提供

hi=

4
注意:echo %~1 的效果与此相同 :-) - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接