重构使用开关的Powershell功能

时间:2019-05-13 11:57:33

标签: powershell

我正在重构一些Powershell代码,我有一个具有多个开关参数的函数。我想从该函数中取出一定数量的代码,并将其放入另一个代码中,然后从原始函数中调用该代码。问题是,如何在不检查父级中存在哪些开关参数的情况下调用子级函数,然后考虑对子级函数调用的所有排列。

这是我的“ Parent”功能的参数列表,大多数开关参数将传递给子功能:

param(
      [parameter(mandatory=$true)]  [string]                                    $RefreshDatabase          
     ,[parameter(mandatory=$true)]  [string]                                    $RefreshSource 
     ,[parameter(mandatory=$true)]  [string[]]                                  $DestSqlInstances   
     ,[parameter(mandatory=$true)]  [string]                                    $PfaEndpoint       
     ,[parameter(mandatory=$true)]  [System.Management.Automation.PSCredential] $PfaCredentials
     ,[parameter(mandatory=$false)] [switch]                                    $PromptForSnapshot
     ,[parameter(mandatory=$false)] [switch]                                    $RefreshFromSnapshot
     ,[parameter(mandatory=$false)] [switch]                                    $NoPsRemoting
     ,[parameter(mandatory=$false)] [switch]                                    $ApplyDataMasks
     ,[parameter(mandatory=$false)] [switch]                                    $ForceDestDbOffline 
     ,[parameter(mandatory=$false)] [string]                                    $StaticDataMaskFile
)

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式发送这些开关参数:

MyNewFunction -PromptForSnapshot:$PromptForSnapshot -RefreshFromSnapshot:$RefreshFromSnapshot -NoPsRemoting:$NoPsRemoting -ApplyDataMasks:$ApplyDataMasks -ForceDestDbOffline:$ForceDestDbOffline

或者为了提高可读性,请使用splating:

$params = @{
    'PromptForSnapshot'   = $PromptForSnapshot
    'RefreshFromSnapshot' = $RefreshFromSnapshot
    'NoPsRemoting'        = $NoPsRemoting
    'ApplyDataMasks'      = $ApplyDataMasks
    'ForceDestDbOffline'  = $ForceDestDbOffline 
}

MyNewFunction @params

如果您的辅助函数使用不同的参数名称,那么您当然需要解决这个问题。

然后,您可以查看$PSBoundParameters自动变量。

答案 1 :(得分:-1)

最后,在将开关参数传递给的子函数中,我将相应的参数指定为具有布尔数据类型,然后将开关参数传递为SwitchParam1.IsPresent,SwitchParam2.IsPresent。 。 。等。我不知道这是否是最优雅的解决方案,但它确实有效。

类似这样的东西:

ParentFunc {
    param(
           [parameter(mandatory=$false)] [switch] $ParentParam1                              
          ,[parameter(mandatory=$false)] [switch] $ParentParam2                                   
    )
.
.
.

ChildFunc {
    param(
           [parameter(mandatory=$false)] [bool] $ChildParam1                                  
          ,[parameter(mandatory=$false)] [bool] $ChildParam2                                
    )
.
.
.

然后您按以下方式调用ChildFunc:

ChildFunc $ParentParam1.IsPresent, $ParentParam2.IsPresent