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

一个快速测试脚本:

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


当前回答

我刚才说过:

常见的问题是使用单数形式$arg,这是不正确的。它应该总是复数形式的$args。

问题不在于此。事实上,$arg可以是其他任何东西。问题在于逗号和圆括号的使用。

我运行以下代码,工作和输出如下:

代码:

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

测试“ABC”“DEF”

输出:

$var1 value: ABC
$var2 value: DEF

其他回答

在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

我刚才说过:

常见的问题是使用单数形式$arg,这是不正确的。它应该总是复数形式的$args。

问题不在于此。事实上,$arg可以是其他任何东西。问题在于逗号和圆括号的使用。

我运行以下代码,工作和输出如下:

代码:

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

测试“ABC”“DEF”

输出:

$var1 value: ABC
$var2 value: DEF
Function Test {
    Param([string]$arg1, [string]$arg2)

    Write-Host $arg1
    Write-Host $arg2
}

这是一个正确的params声明。

看到about_Functions_Advanced_Parameters。

它确实有效。

因为这是一个常见的问题,所以我想提一下,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"