Function 两个函数参数合并为一个?

Function 两个函数参数合并为一个?,function,powershell,parameters,Function,Powershell,Parameters,我在写.ps1脚本时遇到了一些奇怪的行为。我编写了一个接受两个参数的函数,但由于某种原因,第二个参数始终为null 仔细观察,我的两个参数似乎以某种方式被压缩为第一个参数 给定以下脚本,我会预期,一行输出显示 函数Foo$first,$second{ echo$first } $x=。。。 $y=为什么? Foo$x$y 但是当我运行这个脚本时,我得到 ... 为什么? 是否有一些我不知道的PowerShell语法我不小心误用了 是否有一些PowerShell语法…我不小心误用了 是的,您没有正

我在写.ps1脚本时遇到了一些奇怪的行为。我编写了一个接受两个参数的函数,但由于某种原因,第二个参数始终为null

仔细观察,我的两个参数似乎以某种方式被压缩为第一个参数

给定以下脚本,我会预期,一行输出显示

函数Foo$first,$second{ echo$first } $x=。。。 $y=为什么? Foo$x$y 但是当我运行这个脚本时,我得到

... 为什么? 是否有一些我不知道的PowerShell语法我不小心误用了

是否有一些PowerShell语法…我不小心误用了

是的,您没有正确调用函数。在PowerShell中,函数调用不使用括号,也不使用逗号分隔其参数

相反,您可以这样称呼Foo:

Foo$x$y 请参见下面的演示:

PS>函数Foo$first,$second{ >>echo$first >> } >> PS>$x=。。。 PS>$y=为什么? PS>Foo$x$y ... PS> PS>函数Foo$first,$second{ >>echo$first和$second >> } >> PS>Foo$x$y ... 为什么? PS> 如果您想知道,您当前的代码将PowerShell将$x,$y解释为Foo的单个参数:一个两项数组。因此,它将此数组分配给$first,将$null分配给$second:

PS>函数Foo$first,$second{ >>`$first:$$first.Gettype的回显类型 >>echo`$second是`$null:$$second-eq$null >> } >> PS>$x=。。。 PS>$y=为什么? PS>Foo$x$y $first的类型:System.Object[] $second是$null:True PS>
不要在参数周围使用括号,也不要使用逗号分隔参数。像调用任何其他PowerShell命令一样调用函数-使用空格分隔的参数,例如:

foo $x $y
当您将参数放在$x附近时,$y PowerShell将其作为单个表达式/参数传递,在本例中,一个包含两个项的数组将传递给函数的第一个参数$x。您可以使用“严格模式-最新版本”在执行此操作时向您发出警告,例如:

114>函数foo$x,$y{} 115>3,4 116>设置StrictMode-最新版本 117>3,4 调用函数或命令时,将其视为方法。参数之间应使用分隔符分隔 空间。有关参数的信息,请参阅关于参数帮助主题。 第1行字符:1 +食物3,4 + ~~~~~~~~ +CategoryInfo:InvalidOperation::[],运行时异常 +FullyQualifiedErrorId:StrictModeFunctionCallWithParents
在powershell中使用的方式与在其他编程语言中使用的方式不同。这里是数组构造函数

1,2,3.GetType System.Object[] ,'element'.GetType System.Object[] 由于您尚未在参数上指定数据类型,powershell假定它正在处理普通的旧System.Object所有类的超类。然后它获取数组并将其分配给第一个输入参数,因为它是此行中唯一的一个输入参数。它可以做到这一点,因为数组可以扩展为System.Object

此外,不再推荐使用用于定义函数的旧synthax:

函数foo$first,$second{} 编写此命令时,powershell解释器会在内部将其转换为高级函数:

函数foo{ PARAM [参数位置=1] [对象]$first, [参数位置=2] [对象]$秒 开始{} 进程{} 结束{} } foo-第一个“第一”-第二个“第二” foo“第一个”“第二个” 造成不必要的开销。
我希望这能澄清一点:

对于无意中的编辑,我深表歉意。我讨厌如此随意地重新排列答案。