假设我有(在文件test.ps1
中):
param (
[string[]] $one
)
Write-Host $one.Count
如果我这样做:
powershell -File test.ps1 -one "hello","cat","Dog"
我得到:
1
但是我希望:
3
为什么?
答案 0 :(得分:2)
在调用该方法之前,随着转换的进行,整个字符串都传递了“ -one”。
您也可以像下面这样称呼
powershell -Command {.\test.ps1 -one "hello","cat","Dog"}
答案 1 :(得分:0)
补充Kevin Smith's helpful answer:
通过PowerShell CLI将 array 传递到PowerShell脚本的唯一方法(powershell.exe
; pwsh
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。