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

一个快速测试脚本:

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函数应该使用认可的动词(动词-名词作为函数名)。 名称的动词部分标识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#中调用函数那样使用圆括号。


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

如果你是c# / Java / c++ / Ruby / Python /自本世纪选择一种语言的开发人员,你想用逗号调用你的函数,因为这是你一直在做的,那么你需要这样的东西:

$myModule = New-Module -ascustomobject { 
    function test($arg1, $arg2) { 
        echo "arg1 = $arg1, and arg2 = $arg2"
    }
}

现在电话:

$myModule.test("ABC", "DEF")

你们会看到

arg1 = ABC, and arg2 = DEF

我没有看到这里提到它,但是分散参数是一种有用的替代方法,如果您动态地构建命令的参数(而不是使用Invoke-Expression),它会变得特别有用。你可以用数组来表示位置参数,用哈希表来表示命名参数。下面是一些例子:

注意:您可以相对轻松地将位置splats与外部命令参数一起使用,但命名splats与外部命令使用起来不太有用。它们可以工作,但程序必须接受-Key:Value格式的参数,因为每个参数都与哈希表的键/值对相关。这类软件的一个例子是来自Windows的Chocolatey包管理器的choco命令。

Splat With Arrays(位置参数)

使用位置参数测试连接

Test-Connection www.google.com localhost

与阵列溅射

$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentArray

注意,在splapping时,我们用@而不是$引用splapping变量。当使用Hashtable进行splat时也是一样的。

Splat With Hashtable (Named Arguments)

使用命名参数测试连接

Test-Connection -ComputerName www.google.com -Source localhost

用哈希表喷溅

$argumentHash = @{
  ComputerName = 'www.google.com'
  Source = 'localhost'
}
Test-Connection @argumentHash

同时拆分位置参数和命名参数

使用位置参数和命名参数测试连接

Test-Connection www.google.com localhost -Count 1

飞溅数组和哈希表一起

$argumentHash = @{
  Count = 1
}
$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentHash @argumentArray
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
}