包含双引号作为PowerShell脚本参数的字符串

时间:2019-08-17 12:15:49

标签: powershell double-quotes

有人在many times上询问了此问题,但......
我所看到的是必须修改输入字符串的解决方案。通过用单引号替换所有双引号或使用反引号。

但是我无法控制输入字符串,因为我无法访问源。我无法将Hello "W"orld更改为Hello 'W'orldHello """W"""orld

我能做的是用任何转义字符将整个字符串包装起来。例如,在'Hello "W"orld'周围用单引号引起来。但是我尝试过的那些转义机制都没有起作用。而且我可以更改PowerShell脚本

问:如何将带有双引号的字符串作为参数传递给PowerShell,并保留引号?

如何复制

  1. 保存此

    cls
    write-host $args[0]
    

    在桌面上作为PowerShell脚本echoArgs1.ps1

  2. 打开CMD窗口,导航到您的桌面文件夹并输入

    powershell -file echoArgs1.ps1 "Hello "W"orld" 
    

电流输出

enter image description here

所需的输出

enter image description here

2 个答案:

答案 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

请注意,命令行中的命令文件名存在一些陷阱:

  • 它可能包含相对或绝对路径
  • 它可能被引用