将字符串[]从批处理文件(包含双引号")传递给powershell脚本

时间:2018-02-23 23:20:26

标签: c# powershell cakebuild

我有一个powershell脚本,它有一个string[]参数,并尝试从批处理文件中传递值

PowerShell脚本

[string[]]$ScriptArgs

批处理文件

powershell -File Foobar.ps1 -ScriptArgs -versn="""1.0.0.0""",pattern="""FooBar.*"""

(3行情 - 逃避/显示1个报价)

但无论我做什么Write-Host $ScriptArgs.Count打印1

我希望变量接收2个元素

[0]将为-versn="1.0.0.0" [1]将为-pattern="FooBar.*"

在批处理文件中,我甚至尝试单独设置变量

set @sArgs = -versn="""1.0.0.0"""
set @sArgs = %sArgs%;-pattern="""FooBar.*"""
powershell -File Foobar.ps1 -ScriptArgs %sArgs%

但是控制台以某种方式运行,好像没有创建变量并将其作为

运行
powershell -File Foobar.ps1 -ScriptArgs

并抛出错误

  

缺少参数' ScriptArgs'的参数。指定System.String[]类型的参数,然后重试

我应该改变什么来实现这个目标?

1 个答案:

答案 0 :(得分:4)

使用cmd.exe批处理文件(来自-File调用PowerShell脚本时,有没有 直接将值数组传递给PowerShell 数组参数的方式:

  • 如果指定不带空格的数组值,则将它们视为SINGLE元素; e.g:

    • one,two,three成为SINGLE数组元素
  • 如果使用空格,尾随逗号将成为参数的一部分,只有FIRST值绑定到数组参数

    • one, two, three - one, - 包括尾随的, - 成为仅数组元素,two,three,被视为分开参数。

变通办法是:

  • 使用-Command 来调用脚本 - 请参阅底部。

  • 或者,使用-File ,以不同方式声明参数并以不同方式传递参数:

    • 使用属性装饰数组参数 [Parameter(ValueFromRemainingArguments)]
    • 将数组元素作为单独的,以空格分隔的参数传递,而不使用其参数名称

在你的情况下:

  • 声明参数:

    [Parameter(ValueFromRemainingArguments)]
    [string[]] $ScriptArgs
    
  • 使用单独的,空格分开的参数调用脚本,前面没有参数名称,将它们作为数组绑定到$ScriptArgs:< / p>

    powershell -File Foobar.ps1 "-versn=\"1.0.0.0\"" "pattern=\"FooBar.*\""
    
    • 请注意引用:

      • 每个参数作为一个整体都包含在"..."中 - 这不是绝对必要的,而是防范- - 前缀值,例如{{1}被误认为是参数名称。

      • -version字符。要保留为文字 " - 转义(与\形成鲜明对比 - 必须在 PowerShell中使用转义)。

此方法的固有限制

  • 方法不支持多个数组参数,因为只有一个可以使用`进行修饰。

  • 无法传递任何其他参数位置 (即,您必须在参数之前传递给其他参数及其参数名称)。

替代方法:使用ValueFromRemainingArguments代替-Command

-File

注意:

  • 您传递给powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'" 的内容被视为一段PowerShell代码 - 无论您是传递单个参数还是多个< / em> ones - 在后一种情况下,它们只是用空格连接结果然后被解释为PowerShell代码。

  • 其含义是:

    • 要在当前目录中执行脚本,必须使用路径-Command)引用它 - 以便执行它。

      • 此外,如果脚本路径包含空格或其他shell元字符,则必须引用它并通过调用操作符.\调用它;例如,&
    • 您可以像往常一样传递数组参数,除了 & '.\Foo Bar.ps1'个字符。必须再次转发为",而不是\"

    • 另请注意,参数再次引用作为一个整体(也是),在这种情况下必需以阻止PowerShell解释{{1} }和`"作为参数名称。

      • 鉴于整个命令必须在-versn内传递,使用-pattern执行嵌入式引用(仍然可能)是非常尴尬的,因为您必须合并 "..." - 和" - 逃避;例如,\
    • 通常,请注意所有常用的PowerShell解析规则都适用,例如,要使用文字 `,您必须将其转义为{{1} }。