23

我有一个更改注册表项值的 PowerShell 函数。代码:

param(
    [Parameter()] [switch]$CreateNewChild,
    [Parameter(Mandatory=$true)] [string]$PropertyType
)

它有一个参数“CreateNewChild”,如果设置了该标志,该函数将创建 key 属性,即使它没有找到。参数“PropertyType”必须是强制性的,但前提是已设置“CreateNewChild”标志。

问题是,如何使一个参数成为强制性参数,但前提是已指定另一个参数?

好的,我一直在玩它。这确实有效:

param(
  [Parameter(ParameterSetName="one")]
  [switch]$DoNotCreateNewChild,

  [string]$KeyPath,

  [string]$Name,

  [string]$NewValue,

  [Parameter(ParameterSetName="two")]
  [switch]$CreateNewChild,

  [Parameter(ParameterSetName="two",Mandatory=$true)]
  [string]$PropertyType
)

但是,这意味着 $KeyPath、$Name 和 $NewValue 不再是强制性的。将“一个”参数集设置为强制会破坏代码(“参数集无法解析”错误)。这些参数集令人困惑。我确定有办法,但我不知道该怎么做。

4

2 回答 2

37

您可以通过定义参数集来对这些参数进行分组以完成此操作。

param (
    [Parameter(ParameterSetName='One')][switch]$CreateNewChild,
    [Parameter(ParameterSetName='One',Mandatory=$true)][string]$PropertyType
)

参考:

https://devblogs.microsoft.com/powershell/powershell-v2-parametersets

http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx

- - 更新 - -

这是一个模仿您正在寻找的功能的片段。除非调用 -Favorite 开关,否则不会处理“Extra”参数集。

[CmdletBinding(DefaultParametersetName='None')] 
param( 
    [Parameter(Position=0,Mandatory=$true)] [string]$Age, 
    [Parameter(Position=1,Mandatory=$true)] [string]$Sex, 
    [Parameter(Position=2,Mandatory=$true)] [string]$Location,
    [Parameter(ParameterSetName='Extra',Mandatory=$false)][switch]$Favorite,      
    [Parameter(ParameterSetName='Extra',Mandatory=$true)][string]$FavoriteCar
)

$ParamSetName = $PsCmdLet.ParameterSetName
    
Write-Output "Age: $age"
Write-Output "Sex: $sex"
Write-Output "Location: $Location"
Write-Output "Favorite: $Favorite"
Write-Output "Favorite Car: $FavoriteCar"
Write-Output "ParamSetName: $ParamSetName"
于 2012-11-23T18:46:12.030 回答
-4

您还可以使用动态参数:

创建动态参数的新方法

于 2012-11-26T06:50:14.570 回答