将双引号从PowerShell传递到vbScript

问题描述 投票:0回答:1

我正在尝试将一个通用的vbScript实用程序整合在一起,以便在隐藏的窗口中启动PowerShell脚本,因为Microsoft尚未为此提供一种不错的机制。我希望它支持PowerShell的任意参数,因此我需要能够将代表Powershell多个参数的字符串作为单个参数传递给vbScript。

-path:"C:\folder name" -message:"Test message"

但是,似乎vbScript正在清除参数本身中的引号。为了测试这一点,我有这个PS1 ...

$helperScript = "`"\\Mac\iCloud Drive\Px Tools\Dev 4.0\#Spikes\Helper\ArgumentTest.vbs`""
$vbArguments = "/Arguments:-message:`"`"Test message`"`""

$arguments ="$helperScript $vbArguments" 
Start-Process -filePath:cscript.exe -argumentList:$arguments

还有这个VBS ...

Option Explicit

Wscript.Echo """Test for quotes"""
Wscript.Echo WScript.Arguments.Named("Arguments")

WScript.Sleep(5000)

$helperScript中的转义引号按预期工作,允许Start-Process使用Wscript引擎运行VBS。 VBS中的第一个Wscript.Echo验证将显示VBS文件中转义的双引号。我的目标是让第二个Wscript.Echo显示

-message:“测试消息”

在PS1上,我尝试了多种不同的方式将内引号转义

$vbArguments = "/Arguments:-message:`"Test message`""
$vbArguments = "/Arguments:-message:""Test message"""
$vbArguments = "/Arguments:-message:`"`"Test message`"`""
$vbArguments = "/Arguments:-message:`"`"`"Test message`"`"`""

在所有情况下,内部双引号都被删除。我可以建立自己的转义代码,例如~,就像这样...

$vbArguments = "/Arguments:-message:~Test message~"

然后在VBS端查找/替换。但是后来我失去了该字符以供实际使用。我认为这实际上是可能的,而我只是做错了什么。我希望。

编辑:好的,我找到了一个解决方案,但希望有人可以提出一些建议……丑陋。在PS1上,我需要三重双引号以正确维护空格,并且我需要提供单引号,像这样...

$vbArguments = "/Arguments:-message:`"`"`"'Test message`"`"`"'"

然后在VBS上,我需要用chr(34)替换单引号,像这样...

DIM replaced :replaced = Replace(WScript.Arguments.Named("Arguments"), "'", chr(34))

对于发往PowerShell的两个参数的原始示例,三元转义的双引号将整个参数字符串包装起来,在该字符串中使用单引号,最终我们将需要双引号。像这样...

$vbArguments = "/Arguments:-path:`"`"`"'C:\folder name' -message:'Test message`"`"`"'"

最后我需要测试,但是我认为PowerShell在命令行中需要双引号,并且内部仅支持单引号。但我会调查一下。仍然,对于所有不喜欢浮躁的人的爱,这真的是将这些融合在一起的唯一方法吗? gh

我正在尝试将一个通用的vbScript实用程序整合在一起,以便在隐藏的窗口中启动PowerShell脚本,因为Microsoft尚未为此提供一种不错的机制。我希望它支持...

powershell vbscript arguments double-quotes
1个回答
0
投票

在powershell中,我们需要用另一个引号将引号引起来。像这样;

© www.soinside.com 2019 - 2024. All rights reserved.