我有一个使用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\" & """" & "'"
答案 0 :(得分:1)
你需要绕过路径两次双引号:
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 & "'@"