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

一个快速测试脚本:

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


当前回答

我没有看到这里提到它,但是分散参数是一种有用的替代方法,如果您动态地构建命令的参数(而不是使用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 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
}

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

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

我刚才说过:

常见的问题是使用单数形式$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

我不知道你在用这个函数做什么,但看看使用'param'关键字。它在向函数传递参数方面更加强大,并使其更加用户友好。下面是来自微软的一篇过于复杂的文章的链接。这并不像文章说的那么复杂。

参数的使用

另外,这里有一个来自这个网站的问题:

来看看。

在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