首页 > 解决方案 > Powershell:如何在参数中正确实现模式切换?

问题描述

我的函数中有一个代码对我来说效果很好,受到另一个 SO 答案的启发,但在 VSCode 中被标记为不正确。我想改进它,但目前我不知道如何。

Param(
    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Info")]
    [switch] $Info = $false,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Warn")]
    [switch] $Warn = $false,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Error")]
    [switch] $Error = $false,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Fatal")]
    [switch] $Fatal = $false,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Debug")]
    [switch] $Debugging = $false,

)

switch ($PSBoundParameters.Keys) {
    'Info' { $level = "INFO"
             $color = "Green" }
    'Warn' { $level = "WARNING"
             $color = "Yellow" }
    'Error' { $level = "ERROR"
              $color = "Red" }
    'Fatal' { $level = "FATAL"
              $color = "DarkRed" }
    'Debugging' { $level = "DEBUG"
                  $color = "Magenta" }
}

错误是https://github.com/PowerShell/PSScriptAnalyzer/blob/master/RuleDocumentation/AvoidDefaultValueForMandatoryParameter.md - 我明白了,但是如何转换此代码以使其符合犹太教规并且仍然执行相同的功能?

标签: powershellparameters

解决方案


PSSA 抱怨是因为该Mandatory标志适用于用户——用户必须为参数集中标记的所有参数指定参数Mandatory——并且由于用户已经被要求提供参数,因此默认值没有意义,PowerShell 永远不会使用它们。

与未选择的参数集中的开关参数对应的局部变量将默认为$null-like 值,相当于$false无论如何:

Param(
    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Info")]
    [switch] $Info,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Warn")]
    [switch] $Warn,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Error")]
    [switch] $Error,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Fatal")]
    [switch] $Fatal,

    [Parameter( Mandatory = $True,
                ValueFromPipelineByPropertyName = $true,
                Position = 0,
                ParameterSetName = "Debug")]
    [switch] $Debugging,

)

推荐阅读