使用PowerShell在$ args中保留引号

时间:2014-03-06 07:32:33

标签: powershell command-line-arguments

是否可以将引号保留在$args

脚本的调用如下:

.\test1.ps1 a=application o="this object" msg_text="this is a text"

报价是进一步处理的必要条件。有没有办法将它们保留在$args内?

2 个答案:

答案 0 :(得分:2)

我无法修改输入参数的唯一方法仍然需要修改稍微调用的命令。

为了保留引号,可能尝试捕获调用PowerShell脚本的完整命令行。

所以我把它放在test1.ps1脚本中:

Write-Host (Get-WmiObject -Query "select CommandLine from Win32_Process where CommandLine like '%test1%'").CommandLine

然后,如果以这种方式调用脚本,则返回此内容:

PS C:\temp> powershell .\test1.ps1 a=application o="this object" msg_text="this is a text"
"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe"  .\test1.ps1 a=application "o=this object" "msg_text=this is a text"

这只有在调用PowerShell的新实例时才有可能,否则此方法将无法使用这些参数:

PS C:\temp> .\test1.ps1 a=application o="this object" msg_text="this is a text" > zzz3.txt

PS C:\temp>

当然,如果采用这种方法,则需要手动解析输入参数,这可以通过$args对象的帮助来完成。这是一个长镜头,但确实保留了报价。

答案 1 :(得分:2)

您可以使用反引号在PowerShell中转义引号:

.\test1.ps1 a=application o="`"this object`"" msg_text="`"this is a text`""

您也可以在单引号中嵌套双引号(反之亦然)但请注意,变量不会在用单引号分隔的字符串中进行求值。

.\test1.ps1 a=application o='"this object"' msg_text='"this is a text"'

此外,为什么要使用$args?为什么不使用功能强大的内置参数系统?

进一步阅读:

Get-Help About_Quoting_Rules

Stack Overflow - How to Handle Command Line Arguments in PowerShell

TechNet Magazine - Windows PowerShell: Defining Parameters