如果我有一个接受多个字符串参数的函数,第一个参数似乎获得分配给它的所有数据,其余参数作为空传入。
一个快速测试脚本:
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
如果你尝试:
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函数。