繁体   English   中英

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

[英]String containing double quotes as argument for PowerShell Script

这个问题在 SO 上被问了很多,但是......
我所看到的只是必须修改输入字符串的解决方案。 通过用单引号替换所有双引号或使用反引号。

但是我无法控制输入字符串,因为我无法访问源代码。 我无法将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"

电流输出

在此处输入图片说明

期望输出

在此处输入图片说明

您正在使用$(CurText)宏通过外部工具定义将 Visual Studio 中当前选定的文本传递到 PowerShell 脚本文件

不幸的是, Visual Studio 没有提供在所选文本中转义双引号的方法,以保证它最终会被您传递给它的任何外部可执行文件视为原样。

(对于大多数可执行文件,包括 PowerShell,在"..."嵌入文字"字符。 "..."封闭的参数需要将它们转义为\\" - 完整故事请参阅此答案。)

由于缺乏适当的转义的,PowerShell的将无法解析文本作为参数传递给(一个脚本文件*.ps1通过) -File是否包含文字如预期CLI参数"字符。

这是 Visual Studio 的缺点,但有一个解决方法

只传递一个参数,通过[Environment]::CommandLine检查原始命令行,并考虑*.ps1文件后面的所有内容,逐字逐句

为了简化该过程,请传递$(CurText)而不将其包含在外部工具定义中的"..."中(并确保它与前一个标记仅通过一个空格字符分开。)。

echoArgs1.ps1 ,使用以下命令逐字检索参数:

$rawText = ([Environment]::CommandLine -split '\.ps1 ', 2)[-1]

问题是命令行解释器已经删除了引号。 换句话说,在命令到达 PowerShell 解释器之前,引号已经消失了。

您可能会尝试做的是:拉出原始的裸命令行( $MyInvocation.Line )并通过删除命令本身来解析参数:

$FileName = [System.IO.Path]::GetFileName($MyInvocation.MyCommand.Path)
$Arguments = $MyInvocation.Line  -Replace ("^.*\\" + $FileName.Replace(".", "\.") + "['"" ]\s*")
Write-Host $Arguments

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM