解释

解释

我正在尝试通过 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. %~1当参数被括起来时,删除引号。
  2. set "arg=..." 是扩展的 SET 语法,它将内容括在引号中,但不会将引号添加到变量中。`
  3. echo ...!arg1!` 使用了延迟扩展,因为延迟扩展可以处理来自变量的任何内容而无需对其进行解释。

答案3

我只是使用答案空间来展示最终的效果。用户 Mark 是对的。

Dim passwd
passwd = "Hello^^^&123"
retval = Shell("C:\test.bat " & passwd, vbNormalFocus)

现在的 BAT 文件只是

@echo off
echo %1
pause

现在查看结果。为了简单起见,我只是在命令提示符下调用 test.bat。

在此处输入图片描述

相关内容