如何使用参数对象调用PowerShell函数

时间:2018-08-09 17:07:07

标签: powershell

在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;
}

1 个答案:

答案 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
}