gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:13:02 28 4
gpt4 key购买 nike

我有一个具有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

并引发错误

Missing an argument for parameter 'ScriptArgs'. Specify a parameter of type System.String[] and try again



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

最佳答案

从带有cmd.exe的批处理文件(从-File)中调用PowerShell脚本时,无法直接将值数组传递给PowerShell数组参数:

  • 如果您指定不带空格的数组值,则它们将被视为SINGLE元素;否则,它们将被视为单个元素。例如。:
  • one,two,three成为单个数组元素
  • 如果确实使用空格,则尾部逗号将成为参数的一部分,并且只有FIRST值绑定(bind)到array参数:
  • one, two, three-one,-包括结尾的,-成为唯一的数组元素,two,three,被视为独立的参数。

  • 解决方法用于:
  • 要么:使用-Command 调用脚本-参见底部。
  • 或者,使用-File ,以不同的方式声明参数并以不同的方式传递参数:
  • 属性修饰数组参数[Parameter(ValueFromRemainingArguments)]
  • 将数组元素作为单独的,以空格分隔的参数传递,而没有其参数名称

  • 在您的情况下:
  • 声明参数:
    [Parameter(ValueFromRemainingArguments)]
    [string[]] $ScriptArgs
  • 使用单独的,以空格分隔的参数而不是参数名称开头来调用脚本,以将它们作为数组绑定(bind)到$ScriptArgs:
    powershell -File Foobar.ps1 "-versn=\"1.0.0.0\"" "pattern=\"FooBar.*\""
  • 请注意以下引用:
  • 每个参数作为一个整体都包含在"..."中-严格来说这不是必须的,但要防止-前缀的值(例如-version)误认为参数名称。
  • "字符。保留为文字的是\ -escaped(这与必须在PowerShell中使用的` -escapeing相反)。

  • 这种方法的 固有局限性:
  • 方法不支持多个数组参数,因为只有一个可以用ValueFromRemainingArguments装饰。
  • 您的无法在位置位置传递任何其他参数(即,您必须在参数之前加上参数名称将其传递给其他参数)。


  • 替代方法:使用-Command代替-File:
    powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'"

    笔记:
  • 您传递给-Command的内容被视为PowerShell代码的一部分-无论您传递的是单个参数还是多个参数-在后一种情况下,它们都简单地用空格连接,然后将结果解释为PowerShell代码。
  • 的含义是:
  • 要在当前目录中执行脚本,必须使用路径(.\)引用该脚本-才能执行该脚本。
  • 另外,如果脚本路径包含空格或其他shell元字符,则必须将其引用并通过调用操作程序&进行调用。例如,& '.\Foo Bar.ps1'
  • 除了"字符外,您可以照常传递数组参数。必须再次以\"而不是`"进行转义。
  • 还请注意,参数再次被引用为一个整体(太),在这种情况下,这是必需的,以防止PowerShell将-versn-pattern解释为参数名称。
  • 鉴于必须将整个命令传递到"..."内,因此仍然可以使用"进行嵌入式引用是很尴尬的,因为然后必须结合\`转义。例如,\"-pattern=`\"FooBar.*`\"\"
  • 通常,请注意,所有常用的PowerShell解析规则都适用,例如,要使用文字$,您必须将其转为`$
  • 关于c# - 将string []从批处理文件(包含双引号“)传递到powershell脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48957580/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com