脚本中的参数问题

时间:2016-05-06 14:08:20

标签: powershell parameter-sets

在下面我写道:

可以告诉别人我做错了什么
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!"
 }

我想要做的就是让用户选择-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> 

2 个答案:

答案 0 :(得分:3)

您已指定两个属于两个参数集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参数。

答案 1 :(得分:2)

Sean已经提供good answer已经知道您的具体案例中发生了什么,但我想提供一些排查参数集的提示。

获取帮助

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

跟踪呼叫

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

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

这可以让你深入了解正在发生的事情,并引导你如何解决这个问题(或者帮助你意识到你不能做到这一点)。