在下面我写道:
可以告诉别人我做错了什么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>
答案 0 :(得分: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
参数。
答案 1 :(得分:2)
Sean已经提供good answer已经知道您的具体案例中发生了什么,但我想提供一些排查参数集的提示。
或更具体地说,Get-Help
。参数集语法是从param块自动生成的,因此运行Get-Help myFunction
将向您显示PowerShell如何解释您的参数集(在每个集合中有多少参数,哪些参数是强制的等等)。
如果这些设置看起来正确,但您遇到错误并且不确定原因,请让PowerShell向您展示它的绑定参数:
Trace-Command -Name ParameterBinding -Expression { Set-Harden -Permithttp } -PSHost
这可以让你深入了解正在发生的事情,并引导你如何解决这个问题(或者帮助你意识到你不能做到这一点)。