首页 > 解决方案 > PS exclusive parameter set switches - better error message for missing parameter?

问题描述

I've writen a short function to retrive info/status on an installed vpn client - it has 4 switches to specify what information is returned:

Function Get-ConnectInfo() {
    [CmdletBinding()]
    Param(
        [Parameter(ParameterSetName='Binaries')][switch]$BinaryPaths,
        [Parameter(ParameterSetName='Status')][switch]$ConnectionStatus,
        [Parameter(ParameterSetName='Profiles')][switch]$Profiles,
        [Parameter(ParameterSetName='Version')][switch]$Version
    )
#
    Begin {
    # Some code here
    }
    #
    Process {
        Switch ($PSBoundParameters.Keys) {
            BinaryPaths {
                Write-Host "BinaryDetail"
            }
            Version {
                Write-Host "VersionInfo"
            }
            Profiles {
                Write-Host "Profile Info"
            }
            ConnectionStatus {
                Write-Host "Connection Status"
            }
        }
    }
}

Thing is, if you don't pass any parameters, this is the error message:

Get-ConnectInfo : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ Get-ConnectInfo
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ConnectInfo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Get-ConnectInfo

Is there an elegant way to change this error to something more informative like "Parameter not specified"?

标签: powershellparameters

解决方案


你可以:

  • 设置默认参数集
  • 如果在函数内部设置了自定义错误并返回:
function Get-ConnectInfo() {
    [CmdletBinding(DefaultParameterSetName='noOptions')]
    Param(
        [Parameter(ParameterSetName='Binaries')][switch]$BinaryPaths,
        [Parameter(ParameterSetName='Status')][switch]$ConnectionStatus,
        [Parameter(ParameterSetName='Profiles')][switch]$Profiles,
        [Parameter(ParameterSetName='Version')][switch]$Version
    )
#
    Begin {
        if($PSCmdlet.ParameterSetName -eq 'noOptions'){
            throw 'Please pass a switch argument of either "-Version", "-Profiles", "-ConnectionStatus", or "-BinaryPaths"'
            return
        }
    }
    #
    Process {
        Switch ($PSBoundParameters.Keys) {
            BinaryPaths {
                Write-Host "BinaryDetail"
            }
            Version {
                Write-Host "VersionInfo"
            }
            Profiles {
                Write-Host "Profile Info"
            }
            ConnectionStatus {
                Write-Host "Connection Status"
            }
        }
    }
}

推荐阅读