如果我有一个接受多个字符串参数的函数,第一个参数似乎获得分配给它的所有数据,其余参数作为空传入。

一个快速测试脚本:

Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC", "DEF")

生成的输出为

$arg1 value: ABC DEF
$arg2 value: 

正确的输出应该是:

$arg1 value: ABC
$arg2 value: DEF

这似乎在多台机器上v1和v2之间是一致的,所以很明显,我做错了什么。有人能指出具体是什么吗?


当前回答

Function Test {
    Param([string]$arg1, [string]$arg2)

    Write-Host $arg1
    Write-Host $arg2
}

这是一个正确的params声明。

看到about_Functions_Advanced_Parameters。

它确实有效。

其他回答

调用PowerShell函数时不使用圆括号,也不使用逗号作为分隔符。尝试使用:

test "ABC" "DEF"

在PowerShell中,逗号(,)是一个数组操作符,例如:

$a = "one", "two", "three"

它将$a设置为一个包含三个值的数组。

在PowerShell(所有版本)中,函数调用中的参数是用空格分隔的,而不是逗号分隔的。此外,括号完全没有必要,如果Set-StrictMode -Version 2或更高版本激活,将在PowerShell 2.0(或更高版本)中导致解析错误。带圆括号的参数只在. net方法中使用。

function foo($a, $b, $c) {
   "a: $a; b: $b; c: $c"
}

ps> foo 1 2 3
a: 1; b: 2; c: 3

正确的答案已经给出了,但是这个问题似乎很普遍,对于那些想要理解其中微妙之处的人来说,有必要提供一些额外的细节。

我本来想把它作为一个注释,但我想包括一个插图——我从PowerShell函数的快速参考图表上撕下来的。假设函数f的签名是f($a, $b, $c):

因此,可以使用空格分隔的位置参数或与顺序无关的命名参数调用函数。其他陷阱表明,您需要认识到逗号、括号和空白。

如需进一步阅读,请参阅我的文章《掉进兔子洞:PowerShell管道、函数和参数的研究》。这篇文章还包含了快速参考/挂图的链接。

Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC") ("DEF")

如果你不知道(或关心)你将传递多少参数给函数,你也可以使用一个非常简单的方法,如;

代码:

function FunctionName()
{
    Write-Host $args
}

这将打印出所有的参数。例如:

FunctionName a b c 1 2 3

输出

a b c 1 2 3

我发现这在创建使用外部命令的函数时特别有用,这些外部命令可能有许多不同的(可选的)参数,但依赖于所述命令提供关于语法错误等的反馈。

下面是另一个真实世界的例子(为tracert命令创建一个函数,我讨厌不得不记住截断的名称);

代码:

Function traceroute
{
    Start-Process -FilePath "$env:systemroot\system32\tracert.exe" -ArgumentList $args -NoNewWindow
}