我正在重构一些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
)
答案 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