Powershell似乎在参数数组中获得了错误的元素数量

时间:2019-01-17 16:48:09

标签: powershell powershell-v4.0

假设我有(在文件test.ps1中):

param (
    [string[]] $one
)
Write-Host $one.Count

如果我这样做:

powershell -File test.ps1 -one "hello","cat","Dog"

我得到:

1

但是我希望:

3

为什么?

2 个答案:

答案 0 :(得分:2)

在调用该方法之前,随着转换的进行,整个字符串都传递了“ -one”。

您也可以像下面这样称呼

powershell -Command {.\test.ps1 -one "hello","cat","Dog"}

答案 1 :(得分:0)

补充Kevin Smith's helpful answer

  • 通过PowerShell CLI将 array 传递到PowerShell脚本的唯一方法powershell.exepwsh for PowerShell < em> Core )是使用-Commmand

    • 相反, -File将参数解释为文字值 ,并且识别数组,变量引用({{ 1}}),...;在这种情况下,脚本最终会看到带有文字内容$foo单个字符串(由于删除了双引号)。
  • 内部 PowerShell

    • 使用 hello,cat,Dog script块 -Command),如图in Kevin's answer所示,这不仅简化了语法(只在块内使用常规语法),但会产生类型丰富的输出(不像其他外部程序一样,不仅是 strings ),因为目标PowerShell实例使用CLIXML序列化格式输出其结果,调用会话会自动反序列化该结果,就像PowerShell远程处理/后台作业的工作方式一样(但是,后者,反序列化的保真度总是受到限制)。

    • 不过请注意,在PowerShell中,通常不需要CLI ,它会创建(成本高昂的)子进程,并且可以只需直接 调用{ ... }脚本文件:

      • *.ps1
  • 外部 PowerShell 中-通常.\test.ps1 -one hello, cat, Dog /批处理文件-cmd.exe一起使用,包含双引号的字符串 ,其中包含要执行的PowerShell代码,因为外界不支持使用脚本块

    • -Command

请注意,使用powershell -Command ".\test.ps1 -one hello, cat, Dog"就像在PowerShell中直接调用一样,您必须 使用-Command而不是.\test.ps1才能执行文件在当前目录中的名称​​

还要注意,使用简单的参数值时,test.ps1括起来是可选的,这就是为什么上面的命令仅使用"..."而不是hello, cat, Dog的原因;实际上,使用嵌入式"hello", "cat", "Dog"字符。整个"命令字符串中的内容可能会非常棘手-请参见this answer