将string []从批处理文件(其中包含双引号“)传递到powershell脚本

Nik*_*wal 2 c# powershell cakebuild

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

PowerShell脚本

[string[]]$ScriptArgs
Run Code Online (Sandbox Code Playgroud)

批处理文件

powershell -File Foobar.ps1 -ScriptArgs -versn="""1.0.0.0""",pattern="""FooBar.*"""
Run Code Online (Sandbox Code Playgroud)

(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%
Run Code Online (Sandbox Code Playgroud)

但是控制台会以某种方式运行,就像未创建变量一样,并以

powershell -File Foobar.ps1 -ScriptArgs
Run Code Online (Sandbox Code Playgroud)

并引发错误

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

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

mkl*_*nt0 5

当调用一个PowerShell脚本从一个批处理文件(来自cmd.exe)与-File,有没有 办法直接值数组传递到一个PowerShell 阵列参数:

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

    • one,two,three 成为单个数组元素
  • 如果确实使用空格,则尾部逗号将成为参数的一部分,并且只有FIRST值绑定到array参数:

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

该解决方法是:

  • 无论是:使用-Command调用脚本-见底部。

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

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

在您的情况下:

  • 声明参数:

    [Parameter(ValueFromRemainingArguments)]
    [string[]] $ScriptArgs
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用不带参数名称的单独的,以空格分隔的参数来调用脚本,以将它们作为数组绑定到:$ScriptArgs

    powershell -File Foobar.ps1 "-versn=\"1.0.0.0\"" "pattern=\"FooBar.*\""
    
    Run Code Online (Sandbox Code Playgroud)
    • 请注意以下引用:

      • 每个参数作为一个整体都包含在其中"..."-严格来说不是必须的,但是要防止使用- -前缀值,例如-version被误认为参数名。

      • "字符 如要保留文字被\转义(其与对比`,必须从使用-escaping 内的PowerShell)。

这种方法的固有局限性:

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

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


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

powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'"
Run Code Online (Sandbox Code Playgroud)

注意:

  • 传递给您的-Command内容被视为一段PowerShell代码 -无论您传递的是单个参数还是多个参数-在后一种情况下,它们都简单地用空格连接起来,然后将结果解释为PowerShell代码。

  • 含义是:

    • 要在当前目录中执行脚本,必须使用路径(.\)引用该脚本-才能执行该脚本。

      • 另外,如果脚本路径包含空格或其他shell元字符,则必须将其引用并通过&调用运算符进行调用;例如,& '.\Foo Bar.ps1'
    • 您可以通过数组参数像往常一样,除了那个"字符。必须再次逃脱\",不是`"。

    • 还要注意的是再次的论点被引用作为一个整体(太),在这种情况下是需要的,以防止PowerShell与解释-versn,并-pattern作为参数名称。

      • 鉴于必须将整个命令传递给内部"...",使用"仍然有可能执行嵌入的报价,这很尴尬,因为您必须将 \ -和- `转义结合起来;例如,\"-pattern=`\"FooBar.*`\"\"
    • 通常,请注意所有常用的PowerShell解析规则都适用,例如,要使用文字 $,您必须将其转义为`$。