![](/img/trans.png)
[英]double quotes and whitespace as argument to python script in PowerShell
[英]String containing double quotes as argument for PowerShell Script
这个问题在 SO 上被问了很多次,但是......
我所看到的只是必须修改输入字符串的解决方案。 通过用单引号替换所有双引号或使用反引号。
但是我无法控制输入字符串,因为我无法访问源代码。 我无法将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"
您正在使用$(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.