【问题标题】:Passing string[] from batch file (which contains double quotes ") to powershell script将字符串 [] 从批处理文件(包含双引号“)传递给 powershell 脚本
【发布时间】:2018-02-23 23:20:26
【问题描述】:

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

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[] 类型的参数,然后重试

我应该改变什么来实现这一点?

【问题讨论】:

    标签: c# powershell cakebuild


    【解决方案1】:

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

    • 如果您指定不带空格的数组值,则它们被视为 SINGLE 元素;例如:

      • one,two,three 成为单个数组元素
    • 如果你确实使用了空格,尾随逗号成为参数的一部分只有第一个值绑定到数组参数

      • one, two, three - one, - 包括尾随 , - 成为 only 数组元素,two,three, 被视为单独的参数。

    解决方法是:

    • 任一使用-Command 调用脚本 - 见底部。

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

      • 属性修饰数组参数 [Parameter(ValueFromRemainingArguments)]
      • 将数组元素作为单独的、空格分隔的参数传递,不带参数名称

    在你的情况下:

    • 声明参数:

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

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

        • 每个参数作为一个整体 包含在"..." 中 - 这不是绝对必要的,但可以防止 - 前缀值,例如 -version 被误认为参数名字。

        • " 字符。要保留为 literals 的是 \-escaped(这与必须在 in PowerShell 中使用的 `-escaping 形成对比)。

          李>

    这种方法的固有限制

    • 该方法不支持多个数组参数,因为只有一个可以用ValueFromRemainingArguments修饰。

    • 不能按位置传递任何其他参数(即,您必须在参数之前以参数名称传递给其他参数)。


    替代方案:使用-Command 代替-File

    powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'"
    

    注意:

    • 您传递给-Command 的内容被视为一段 PowerShell 代码 - 无论您传递 单个 参数还是 多个 那些 - 在后一种情况下,它们只是用空格连接,然后 result 被解释为 PowerShell 代码。

    • 含义是:

      • 要在当前目录中执行脚本,您必须使用 path (.\) 引用它 - 以便执行它。

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

      • 另请注意,再次引用参数作为一个整体(也),在这种情况下需要以防止PowerShell解释-versn-pattern作为参数名称。

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

    【讨论】:

      猜你喜欢
      • 2023-01-23
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多