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

一个快速测试脚本:

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之间是一致的,所以很明显,我做错了什么。有人能指出具体是什么吗?


当前回答

如果你尝试:

PS > Test("ABC", "GHI") ("DEF")

你会得到:

$arg1 value: ABC GHI
$arg2 value: DEF

你可以看到括号分隔了参数


如果你尝试:

PS > $var = "C"
PS > Test ("AB" + $var) "DEF"

你会得到:

$arg1 value: ABC
$arg2 value: DEF

现在您可以发现括号的一些直接用处—空格不会成为下一个参数的分隔符—相反,您有一个eval函数。

其他回答

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

Test("ABC") ("DEF")

你也可以像这样在函数中传递参数:

function FunctionName()
{
    Param ([string]$ParamName);
    # Operations
}

因为这是一个常见的问题,所以我想提一下,PowerShell函数应该使用认可的动词(动词-名词作为函数名)。 名称的动词部分标识cmdlet执行的操作。名称的名词部分标识执行动作的实体。该规则简化了高级PowerShell用户对cmdlet的使用。

此外,你还可以指定参数是否为强制参数以及参数的位置:

function Test-Script
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$arg1,

        [Parameter(Mandatory=$true, Position=1)]
        [string]$arg2
    )

    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

要将参数传递给函数,你可以使用position:

Test-Script "Hello" "World"

或者指定参数名:

Test-Script -arg1 "Hello" -arg2 "World"

你不像在c#中调用函数那样使用圆括号。


我建议在使用多个参数时始终传递参数名,因为这样可读性更好。

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
}