1

有人可以在我写的下面告诉我我做错了什么:

function set-harden {
[CmdletBinding(DefaultParameterSetName='NormalHardening')]
param (
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
[Parameter(ParameterSetName='PermitHTTP' ,Mandatory=$True)]
[Parameter(ParameterSetName='PermitHTTPS' ,Mandatory=$True)]
            [switch]$DONOTRemovefromdomain,

[Parameter(ParameterSetName='PermitHTTP')]
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
            [switch]$Permithttp,

[Parameter(ParameterSetName='PermitHTTPS')]
[Parameter(ParameterSetName='DoNotRemoveFromDomain')]
        [switch]$Permithttps,

[Parameter(ParameterSetName='NormalHardening')]
            $NormalHardening
 )}

 If($NormalHardening -eq ""){
    Write-Host "Excellent!"
 }

我要做的就是让用户选择-DONOTRemovefromdomainor-Permithttp甚至-Permithttps. 用户可以有多种选项可供选择。

当我在下面运行时,我收到一个错误:

PS C:\Temp> set-harden -DONOTRemovefromdomain -Permithttp
set-harden : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ set-harden -DONOTRemovefromdomain -Permithttp
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [set-harden], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,set-harden

此外,如果我没有指定任何内容(所以它应该只是转到参数 NormalHardening),我会得到一个什么都没有返回:

PS C:\Temp> set-harden

PS C:\Temp> 
4

2 回答 2

3

您已经指定了两个标志,DONOTRemovefromDomain它们Permithttp属于两个参数集,DoNotRemoveFromDomain并且PermitHttp. 命令解析器无法知道您指的是哪个参数集,因此您会收到错误消息。

当您不指定任何内容时不会出现错误的原因是您已将默认参数集显式设置为NormalHardening. 您尚未Mandatory在此参数集中的单个参数上设置标志,并且默认情况下参数不是强制性的,因此您不会看到错误。

为什么不设置所有这些参数集,而不是只设置 2 个,一个用于默认值,一个用于您要设置的所有标志:

function set-harden {
[CmdletBinding(DefaultParameterSetName='NormalHardening')]
param (
[Parameter(ParameterSetName='Options')]
[switch]$DONOTRemovefromdomain,

[Parameter(ParameterSetName='Options')]
[switch]$Permithttp,

[Parameter(ParameterSetName='Options')]
[switch]$Permithttps,

[Parameter(ParameterSetName='NormalHardening')]
$NormalHardening
 )}

 If($PSCmdlet.ParameterSetName -eq "Options"){
    Write-Host "Excellent!"
 }

如何,如果参数集名称设置为Options您可以检查和应用标志。如果它设置为,NormalHarding那么您知道使用该$NormalHardening参数。

于 2016-05-06T14:15:40.223 回答
2

肖恩已经就您的具体情况给出了一个很好的答案,但我想包括一些对参数集进行故障排除的技巧。

得到帮助

或者更具体地说,Get-Help. 参数集语法是从 param 块自动生成的,因此运行Get-Help myFunction将向您展示 PowerShell 如何解释您的参数集(有多少,每个参数集中哪些参数是强制性的或不是强制性的,等等)。

追踪电话

如果集合看起来正确,但您遇到错误并且不确定原因,让 PowerShell 向您展示它是如何绑定参数的:

Trace-Command -Name ParameterBinding -Expression { Set-Harden -Permithttp } -PSHost

这可以让您深入了解正在发生的事情,并引导您了解如何解决该问题(或帮助您意识到自己无法解决)。

于 2016-05-06T14:20:42.003 回答