我正在尝试通过 VB Shell 函数将参数传递给 BAT 文件。参数文本值如下所示。Hello&123
正如您所注意到的,其中有一个“&”作为文本。但是 & 在 BAT 中是保留的,所以我尝试让它工作,但到目前为止没有成功。
我的 VB 6 代码是
Dim passwd
passwd = "Hello^&123"
retval = Shell("C:\test.bat " & passwd, vbNormalFocus)
我尝试了以下组合,但都不起作用。所以我不知道应该在 VB 6 中将变量 passwd 设置为什么值,才能接受 Hello&123 作为 BAT 中的正确文本参数。
我收到的错误
passwd = "你好^&123"
Hello
'123' is not recognized as an internal or external command,
passwd = """Hello^&123"""
"Hello^&123"
passwd = "你好&&123"
Hello
但是以上都没有用,因为我希望 %1 与 Hello&123 完全一样
任何进一步的帮助都将非常有帮助。
编辑...
刚才的批处理文件只是简单的有echo命令。
@echo off
echo %1
pause
谢谢。
答案1
错误可能出在批处理文件中。您正确地传递了参数,但批处理却得到了 & 符号。您需要再次对批处理文件进行转义。也许吧^^^&
。
^
是引号字符,所以^^
= ^
。
因此,cmd
将变为,并将^^^&
变为,因此最终结果是。当 CMD 读取您的批处理文件时,它会更改为。因此 CMD 需要读取两次。^^
^
^&
&
^&
^&
&
如果按照提示输入,引用通常会更容易。
答案2
不应该改变输入,而应该改变处理。
test.bat Hello^&123
... 或带引号...
test.bat "Hello&123"
@echo off
set "arg1=%~1"
setlocal EnableDelayedExpansion
echo arg1=!arg1!
解释
%~1
当参数被括起来时,删除引号。set "arg=..."
是扩展的 SET 语法,它将内容括在引号中,但不会将引号添加到变量中。`- echo ...!arg1!` 使用了延迟扩展,因为延迟扩展可以处理来自变量的任何内容而无需对其进行解释。