ste*_*tej 9 parameters powershell function powershell-2.0
一般代码
考虑以下代码:
PS> function Test { param($p='default value') $PsBoundParameters }
PS> Test 'some value'
Key Value
--- -----
p some value
PS> Test
# nothing
Run Code Online (Sandbox Code Playgroud)
我希望在两种情况下$PsBoundParameters都包含$p变量记录.这是正确的行为吗?
题
我想使用这样的splatting来实现很多功能:
function SomeFuncWithManyRequiredParams {
param(
[Parameter(Mandatory=$true)][string]$p1,
[Parameter(Mandatory=$true)][string]$p2,
[Parameter(Mandatory=$true)][string]$p3,
...other parameters
)
...
}
function SimplifiedFuncWithDefaultValues {
param(
[Parameter(Mandatory=$false)][string]$p1='default for p1',
[Parameter(Mandatory=$false)][string]$p2='default for p2',
[Parameter(Mandatory=$false)][string]$p3='default for p3',
...other parameters
)
SomeFuncWithManyRequiredParams @PsBoundParameters
}
Run Code Online (Sandbox Code Playgroud)
我不想用枚举的所有参数调用SomeFuncWithManyRequiredParams:
SomeFuncWithManyRequiredParams -p1 $p1 -p2 $p2 -p3 $p3 ...
Run Code Online (Sandbox Code Playgroud)
可能吗?
这取决于你如何定义"绑定"我猜是即从用户提供的值绑定的值或函数提供的默认值?老实说,它并没有让我感到惊讶的是它的行为方式,因为我认为"绑定"意味着前者 - 从用户输入绑定.无论如何,你可以通过修补$ PSBoundParameters变量来解决这个问题,例如:
function SimplifiedFuncWithDefaultValues {
param(
[Parameter(Mandatory=$false)][string]$p1='default for p1',
[Parameter(Mandatory=$false)][string]$p2='default for p2',
[Parameter(Mandatory=$false)][string]$p3='default for p3',
...other parameters
)
if (!$PSBoundParameters.ContainsKey(p1))
{
$PSBoundParameters.p1 = 'default for p1'
}
# rinse and repeat for other default parameters.
SomeFuncWithManyRequiredParams @PSBoundParameters
}
Run Code Online (Sandbox Code Playgroud)
我知道这个问题已经很老了,但我最近需要这样的东西(想要用很多默认参数进行喷涂).我想出了这个并且效果很好:
$params = @{}
foreach($h in $MyInvocation.MyCommand.Parameters.GetEnumerator()) {
try {
$key = $h.Key
$val = Get-Variable -Name $key -ErrorAction Stop | Select-Object -ExpandProperty Value -ErrorAction Stop
if (([String]::IsNullOrEmpty($val) -and (!$PSBoundParameters.ContainsKey($key)))) {
throw "A blank value that wasn't supplied by the user."
}
Write-Verbose "$key => '$val'"
$params[$key] = $val
} catch {}
}
Run Code Online (Sandbox Code Playgroud)
无耻的插件:我决定把它变成一篇博文,里面有更多的解释和一个示例用法脚本.
| 归档时间: |
|
| 查看次数: |
7787 次 |
| 最近记录: |