脚本中的参数问题

Parameters issue in script

谁能告诉我我在下面写的地方做错了什么:

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!"
 }

我只想让用户select-DONOTRemovefromdomain-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> 

您指定了两个标志 DONOTRemovefromDomainPermithttp,它们属于两个参数集 DoNotRemoveFromDomainPermitHttp。命令解析器无法知道你指的是哪个参数集,所以你会得到一个错误。

您未指定任何内容时不会收到错误的原因是您已将默认参数集显式设置为 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 参数。

Sean gave a 已经了解了您的具体情况,但我想包括一些用于对参数集进行故障排除的提示。

获得帮助

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

跟踪呼叫

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

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

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