有人在many times上询问了此问题,但......
我所看到的是必须修改输入字符串的解决方案。通过用单引号替换所有双引号或使用反引号。
但是我无法控制输入字符串,因为我无法访问源。我无法将Hello "W"orld
更改为Hello 'W'orld
或Hello """W"""orld
我能做的是用任何转义字符将整个字符串包装起来。例如,在'Hello "W"orld'
周围用单引号引起来。但是我尝试过的那些转义机制都没有起作用。而且我可以更改PowerShell脚本
问:如何将带有双引号的字符串作为参数传递给PowerShell,并保留引号?
保存此
cls
write-host $args[0]
在桌面上作为PowerShell脚本echoArgs1.ps1
。
打开CMD窗口,导航到您的桌面文件夹并输入
powershell -file echoArgs1.ps1 "Hello "W"orld"
答案 0 :(得分:1)
您正在使用$(CurText)
宏通过external tools定义将Visual Studio中当前选择的文本传递到PowerShell脚本文件。
不幸的是, Visual Studio没有提供一种在所选文本中转义双引号的方法,以确保您最终使用的任何外部可执行文件都将其视为原样。传递给。
(对于大多数可执行文件,包括PowerShell,将文字"
字符嵌入在"..."
内的自变量中,需要将它们转义为\"
-有关完整内容,请参见this answer )
由于缺少适当的转义,PowerShell无法按预期解析通过*.ps1
CLI参数作为参数传递给脚本文件(-File
)的文本(如果它包含文字) "
个字符。
这是Visual Studio的缺点,但是有解决方法:
仅传递了一个参数,通过[Environment]::CommandLine
检查原始命令行,并考虑*.ps1
文件后的所有内容, verbatim 。
为简化该过程,请传递$(CurText)
而没有将其括在外部工具定义的"..."
中(并确保将其与以前的标记分隔开一个空格字符。)
在echoArgs1.ps1
内,使用以下命令逐字检索参数:
$rawText = ([Environment]::CommandLine -split '\.ps1 ', 2)[-1]
答案 1 :(得分:0)
问题是命令行解释器已经删除了引号。换句话说,在命令到达PowerShell解释器之前,引号已经消失了。
您可能想做的是:拉出原始的裸命令行($MyInvocation.Line
)并通过删除命令本身来解析参数:
$FileName = [System.IO.Path]::GetFileName($MyInvocation.MyCommand.Path)
$Arguments = $MyInvocation.Line -Replace ("^.*\\" + $FileName.Replace(".", "\.") + "['"" ]\s*")
Write-Host $Arguments
请注意,命令行中的命令文件名存在一些陷阱: