在PowerShell中,通常可以使用如下参数调用函数:
DoRoutineStuff -Action 'HouseKeeping' -Owner 'Adamma George' -Multiples 4 -SkipEmail
要在运行时捕获这4个提供的参数,可以将其放在函数定义中
""
"ARGUMENTS:"
$PSBoundParameters
显示的结果对象可能如下所示:
ARGUMENTS:
Key Value
--- -----
Action HouseKeeping
Owner Adamma George
Multiples 4
SkipEmail True
现在,我的问题是:如果我要手动构建与上面显示的$PSBoundParameters
相同的$ MyObject,有没有办法说:
RunFunction 'DoRoutineStuff' -oArgument $MyObject
再次,如果它是脚本文件而不是函数DoRoutineStuff
,那有什么区别吗?
为什么可能需要这样做?
设想一种情况,您需要使用$PSBoundParameters
捕获提供给第一个脚本或函数的参数,就像这样:
DoRoutineStuff{
param(
[string]$Action,
[string]$Owner,
[Int]$Multiples,
[switch]$SkipEmail
)
$Data = $PSBoundParameters
#Update one object property
$Data.Multiples = 1
#Then, recursively call `DoRoutineStuff` using `$Data`
#Other tasks
exit;
}
答案 0 :(得分:2)
听起来您正在寻找的语言功能是splatting。
您只需将名为参数的参数打包到哈希表中,将其存储在变量中,然后在其名称前使用@
传递变量即可。
$myArguments = @{
Action = 'HouseKeeping'
Owner = 'Adamma George'
Multiples = 4
SkipEmail = $true
}
Do-Stuff @myArguments
您还可以使用此技术仅传递一组 partial 参数参数(或根本不传递),非常适合传递 conditional 参数:
$myArguments = @{}
if($someCondition){
$myArguments['Multiples'] = 1
$myArguments['SkipEmail'] = $true
}
if($somethingElse){
$myArguments['Multiple'] = 4
}
Do-Stuff -Action 'HouseKeeping' -Owner 'Adamma George' @myArguments
您还可以重复使用$PSBoundParameters
进行进一步的扩展-对于代理功能非常有用:
function Measure-Files
{
param(
[Parameter(Mandatory = $true)]
[string]$Path,
[Parameter(Mandatory = $false)]
[string]$Filter,
[Parameter(Mandatory = $false)]
[switch]$Recurse
)
return (Get-ChildItem @PSBoundParameters |Measure-Object -Property Length).Sum
}