我正在尝试编写PS函数,该函数应根据指定的开关参数给出激活或停用命令。
我希望在两个不同的参数集中设置$ Active和$ Inactive,但是我想用$ Active \ $ Inactive指定$ InputFile或$ Policy
function ModifyState (
[Parameter(Mandatory=$false,ParameterSetName="A")]
[Parameter(Mandatory=$false,ParameterSetName="I")]
[string]$InputFile,
[Parameter(Mandatory=$false,ParameterSetName="A")]
[Parameter(Mandatory=$false,ParameterSetName="I")]
[string]$Object,
[Parameter(Mandatory=$false,ParameterSetName="A")]
[switch]$Active,
[Parameter(Mandatory=$false,ParameterSetName="I")]
[switch]$Inactive
) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
当我运行不带指定参数的命令时,或者当我指定“太多参数”时,都会出现有关参数集过多的错误。
命令:
ModifyState -InputFile .\temp.txt -Inactive -Active
错误:
ModifyState : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ ModifyState -InputFile .\temp.txt -Inactive -Active
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [ModifyState], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,ModifyState
问题1: 参数代码正确吗?
问题2: 当参数集存在歧义时,是否可以返回默认消息?
希望我很清楚,谢谢你
db
更新18/11/18 这些是我要提供的命令示例:
#Parameterset "I"
ModifyState -Object PARAMVALUE -Inactive
or
ModifyState -InputFile PARAMVALUE -Inactive
#Parameterset "A"
ModifyState -Object PARAMVALUE -Active
or
ModifyState -InputFile PARAMVALUE -Active
-Active和-Inactive不能同时给出。 另外-InputFile和-Object不能同时给出。
db
答案 0 :(得分:0)
以您与我们共享的示例为例,以下将是有效的参数集:
#Parameterset "I"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Inactive
#Parameterset "A"
ModifyState -InputFile PARAMVALUE -Object PARAMVALUE -Active
如果仅计划使用这两个参数集,并且您有一些对这两个参数均有效的参数,则实际上不需要在参数集中声明它们-除非它们的表现不同。
所以您的示例可以这样写:
function ModifyState (
[string]$InputFile,
[string]$Object,
[Parameter(Mandatory = $false, ParameterSetName = "A")]
[switch]$Active,
[Parameter(Mandatory = $false, ParameterSetName = "I")]
[switch]$Inactive) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
}
如果计划在不使用任何参数的情况下执行函数,则需要提供[CmdletBinding(DefaultParameterSetName = 'Default')]
部分并提供参数的默认值。
function ModifyState {
[CmdletBinding(DefaultParameterSetName = 'A')]
param(
[string]$InputFile = "Filepath",
[string]$Object,
[Parameter(Mandatory = $false, ParameterSetName = "A")]
[switch]$Active = [switch]::Present,
[Parameter(Mandatory = $false, ParameterSetName = "I")]
[switch]$Inactive) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
}
}
这将使您无需参数即可运行该函数。始终会设置-Active,而-InputFile将始终将您指定为默认值的文件指向
。所有这些都准备就绪-您对ModifyState -InputFile .\temp.txt -Inactive -Active
有什么期望?
您应该使用:
ModifyState -InputFile .\temp.txt -Inactive
或
ModifyState -InputFile .\temp.txt -Active
具有您定义的当前参数集。
请向您询问有关您要解决的问题的更多详细信息,以便我们为您提供帮助。
答案 1 :(得分:0)
对于更新的要求,您应该执行以下操作:
function ModifyState (
[Parameter(Mandatory = $false, ParameterSetName = "Active-File")]
[Parameter(Mandatory = $false, ParameterSetName = "Inactive-File")]
[string]$InputFile,
[Parameter(Mandatory = $false, ParameterSetName = "Active-Object")]
[Parameter(Mandatory = $false, ParameterSetName = "Inactive-Object")]
[string]$Object,
[Parameter(Mandatory = $false, ParameterSetName = "Active-File")]
[Parameter(Mandatory = $false, ParameterSetName = "Active-Object")]
[switch]$Active,
[Parameter(Mandatory = $false, ParameterSetName = "Inactive-File")]
[Parameter(Mandatory = $false, ParameterSetName = "Inactive-Object")]
[switch]$Inactive
) {
switch ($PsCmdlet.ParameterSetName) {
"A" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Activate $obj"
}
}
else {write-host "Activate $Object"}
}
"I" {
if ($InputFile) {
foreach ($obj in (gc $InputFile)) {
write-host "Deactivate $obj"
}
}
else {write-host "Deactivate $Object"}
}
}
}
说明 排除“对象”参数和“活动”参数之后,您将需要4个不同的参数集来满足您的要求。