如何在VBS Shell命令参数中转义等于=符号

时间:2018-11-15 07:57:10

标签: batch-file vbscript escaping wsh

在Windows 2012 R2上使用VBS,我试图传递命令行参数isActive="false",但我无法在命令行中显示等号。

创建一个类似test.bat的虚拟批处理文件

echo %1
Pause

然后在创建的VBScript中

 Set oShell = WScript.CreateObject("WSCript.Shell")
 oShell.CurrentDirectory = "C:\test"
 'strEqual = Chr(61)
 strCommand = "test.bat" & " " & "isActive=" &"""false"""
 return = oShell.Run(strCommand, 1, True)
 Set oShell = Nothing

我得到 isActive“ false” ,但没有等号。 我试图分离出一个独特的价值 类似于& Chr(61) &,并尝试在等号前后使用/\以及//\\进行转义。我试图将strEqual = Chr(61)用作变量。

当传递给命令shell时,如何使=成为字符串的一部分,我感到茫然。我可以将其写入文本文件,并写入等号,但不能写入外壳。

2 个答案:

答案 0 :(得分:1)

您观察到此行为,因为CMD不仅使用空格和制表符,而且还使用逗号,分号和=字符作为parameter delimiters。意味着isActive="false"被解析为2个不同的参数:isActive"false"。如果要将其解析为单个参数,则需要将整个键/值对放在引号中:"isActive=false"

请注意,必须通过将VBScript字符串文字中的双引号加倍来对其进行转义。如果您需要在参数的值部分加上双引号,只需添加另一组转义的双引号即可。

Set oShell = CreateObject("WScript.Shell")
strCommand = "test.bat ""isActive=""false"""""
return = oShell.Run(strCommand, 1, True)

也不需要连接字符串文字(出于可读性的原因,当您要包装长字符串时除外)。只需将命令定义为单个字符串即可。

答案 1 :(得分:1)

您可以使用过程环境变量将值从VBS传递到BAT / CMD。

将以下代码另存为test.vbs:

strCurDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\"
CreateObject("WScript.Shell").Environment("process").Item("myvar") = "isActive=""false"""
CreateObject("WSCript.Shell").Run strCurDir & "test.bat"

并且此代码另存为test.bat在同一文件夹中:

echo %myvar%
pause

运行test.vbs,控制台输出将

  

C:\ Windows \ system32> echo isActive =“ false”
isActive =“ false”