PowerShell Parameter Set搭配Switch参数失效问题求助
PowerShell参数集配置修正方案
问题诊断
你的脚本未正确通过参数集关联AlternateLocation开关与对应的必填目标参数,导致PowerShell无法识别开关触发的约束规则,因此不会强制要求输入$Target、$TargetDbName等参数。
修正后的脚本代码
[CmdletBinding(DefaultParameterSetName = 'DefaultRestore')] param( # 通用必填参数,同时归属两个参数集 [Parameter(Mandatory = $true, ParameterSetName = 'DefaultRestore')] [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$Domain, [Parameter(Mandatory = $true, ParameterSetName = 'DefaultRestore')] [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$CohesityVip, [Parameter(Mandatory = $true, ParameterSetName = 'DefaultRestore')] [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$Source, [Parameter(Mandatory = $true, ParameterSetName = 'DefaultRestore')] [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$SourceDbName, [Parameter(Mandatory = $true, ParameterSetName = 'DefaultRestore')] [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$UserName, # 默认参数集的可选参数 [Parameter(Mandatory = $false, ParameterSetName = 'DefaultRestore')] [string]$RestoreTo, # 替代位置开关,仅归属AlternateLocationRestore参数集 [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [switch]$AlternateLocation, # 替代位置必填参数,仅归属AlternateLocationRestore参数集 [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$Target, [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$TargetDbName, [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$MdfFolder, [Parameter(Mandatory = $true, ParameterSetName = 'AlternateLocationRestore')] [string]$LdfFolder ) # 根据参数集生成restoreSQL.ps1命令 if ($PSCmdlet.ParameterSetName -eq 'DefaultRestore') { $command = ".\restoreSQL.ps1 -Domain $Domain -CohesityVip $CohesityVip -Source $Source -SourceDbName $SourceDbName -UserName $UserName" if ($RestoreTo) { $command += " -RestoreTo $RestoreTo" } } else { $command = ".\restoreSQL.ps1 -Domain $Domain -CohesityVip $CohesityVip -Source $Source -SourceDbName $SourceDbName -UserName $UserName -Target $Target -TargetDbName $TargetDbName -MdfFolder $MdfFolder -LdfFolder $LdfFolder" } Write-Output $command
关键配置说明
- 参数集划分:
- 创建
DefaultRestore(默认)和AlternateLocationRestore两个参数集 - 通用必填参数同时归属两个集合,确保无论哪个场景都必须输入
- 创建
- 开关与参数关联:
AlternateLocation开关仅归属AlternateLocationRestore集合,且设为Mandatory=$true,作为该参数集的触发标识- 目标相关参数(
$Target、$TargetDbName等)仅归属AlternateLocationRestore集合,且设为必填
- 默认参数集:通过
CmdletBinding指定DefaultParameterSetName,确保不使用开关时自动启用默认集合
验证场景
- 场景1(无开关):运行脚本仅提示输入通用必填参数,可选添加
-RestoreTo,输出符合预期的命令 - 场景2(使用
-AlternateLocation):运行脚本会强制要求输入$Target、$TargetDbName等参数,输出包含目标参数的完整命令
内容的提问来源于stack exchange,提问作者user351479
相关产品推荐
相关产品推荐

