рефакторинг функций powershell, использующих переключатели - PullRequest
0 голосов
/ 13 мая 2019

Я нахожусь в процессе рефакторинга некоторого кода 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 голосов
/ 15 мая 2019

В конце концов, в дочерней функции, которой я передавал параметры переключателя, я указал соответствующие аргументы как имеющие логические типы данных и передал параметры переключателя в виде 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 
0 голосов
/ 13 мая 2019

Вы можете отправить эти параметры переключателя с помощью:

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

или для лучшей читабельности используйте сплаттинг:

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

MyNewFunction @params

Если ваша вторичная функция использует разные имена параметров, вам необходимоЭто, конечно, необходимо учитывать.

Тогда вы можете взглянуть на автоматическую переменную $ PSBoundParameters .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...