从VBScript调用PowerShell - 缺少双引号

时间:2016-10-13 15:35:49

标签: powershell vbscript

我有一个使用powershell.exe对象的Shell方法调用Exec的VBScript。

出于问题的目的,我从脚本中提取了一些麻烦的代码并简化了它。

以下脚本的预期结果是PowerShell的Write-Host cmdlet将打印以下内容:

Please save the file to "C:\test"

但实际结果如下:

Please save the file to C:\test"

缺少文件路径周围的初始双引号。

Option Explicit

Dim strPsCommand, ps, objShell, objExec
Dim strStdOut, strStdErr
Dim strStringToPrint

strStringToPrint = "$text = @'" & vbCrLf & "Please save the file to ""C:\test\""" & vbCrLf & "'@"

strPsCommand = strStringToPrint & "; Write-Host $text"
ps = "powershell.exe -Command " & strPsCommand

Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec(ps)

' Close standard input before reading standard output.
objExec.StdIn.Close()

strStdOut = objExec.StdOut.ReadAll()
strStdErr = objExec.StdErr.ReadAll()

WScript.Echo strStdOut
WScript.Echo strStdErr

上面的代码使用了here-string(最适合我的脚本)。但是我试过用它代替常规字符串,但结果是一样的。为此,我更改了strStringToPrint的值,如下所示:

strStringToPrint = "$text = 'Please save the file to " & """" & "C:\test\" & """" & "'"

1 个答案:

答案 0 :(得分:1)

你需要绕过路径两次双引号:

  • for VBScript
  • 用于命令行(Exec调用)

前者是通过加倍双引号来完成的。对于后者,你需要反斜杠。在路径后面的双引号之前已经有一个反斜杠(尽管可能是无意的),但是在路径之前的双引号之前没有。

改变这个:

strStringToPrint = "$text = @'" & vbCrLf & "Please save the file to ""C:\test\""" & vbCrLf & "'@"

进入这个:

strStringToPrint = "$text = @'" & vbCrLf & "Please save the file to \""C:\test\""" & vbCrLf & "'@"

或者这个(如果你想在路径中使用尾部反斜杠):

strStringToPrint = "$text = @'" & vbCrLf & "Please save the file to \""C:\test\\\""" & vbCrLf & "'@"