我以这种方式在PowerShell脚本中使用切换参数。
param(
[switch] $Word,
[switch] $Excel,
[switch] $powerpoint,
[switch] $v2007,
[switch] $v2010,
[switch] $x86,
[switch] $x64,
)
我试图弄清楚任何简洁的方式让它更加枚举风格。 正如任何人可能猜到的那样,我希望用户在word,excel和powerpoint之间进行选择。 在x2007和v2010之间。
是否有一种简洁的方法来获取输入参数枚举样式?
我是PowerShell的新手。所以,如果这听起来像我不知道一些明显的东西,那么请指出我可以阅读的一些链接。
答案 0 :(得分:92)
我会使用ValidateSet
参数属性。
来自:about_Functions_Advanced_Parameters
ValidateSet属性为a指定一组有效值 参数或变量。如果是,Windows PowerShell会生成错误 参数或变量值与集合中的值不匹配。
示例功能:
function test-value
{
param(
[Parameter(Position=0)]
[ValidateSet('word','excel','powerpoint')]
[System.String]$Application,
[Parameter(Position=1)]
[ValidateSet('v2007','v2010')]
[System.String]$Version
)
write-host "Application: $Application"
write-host "Version: $Version"
}
PS > test-value -application foo
输出:
test-value : Cannot validate argument on parameter 'Application'. The argument "foo" does not belong to the set "word,excel,powerpoint" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.
答案 1 :(得分:11)
您可以使用ValidateSet
属性:
function My-Func
{
param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[ValidateSet('Word', 'Excel', 'PowerPoint', 'v2007', 'v2010', 'x86', 'x64')]
[String]$MyParam
)
Write-Host "Performing action for $MyParam"
}
My-Func -MyParam 'Word'
My-Func -MyParam 'v2007'
My-Func -MyParam 'SomeVal'
输出:
Performing action for Word
Performing action for v2007
My-Func : Cannot validate argument on parameter 'MyParam'. The argument "SomeVal" does not belong to the set "Word,Excel,PowerPoint,v2007,v2010,x86,x64" specified by the ValidateSet attribute. Supply an argument that is in the
set and then try the command again.
At C:\Users\George\Documents\PowerShell V2\ValidateSetTest.ps1:15 char:17
+ My-Func -MyParam <<<< 'SomeVal'
+ CategoryInfo : InvalidData: (:) [My-Func], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,My-Func
答案 2 :(得分:10)
此blog post by the PowerShell team定义了如何在PowerShell 1.0中执行此操作。在PowerShell 2.0中,您可以像这样使用Add-Type:
C:\PS> Add-Type -TypeDefinition @'
>> public enum MyEnum {
>> A,
>> B,
>> C,
>> D
>> }
>> '@
>>
更新:以下是使用枚举的方法:
C:\PS> function foo([MyEnum]$enum) { $enum }
C:\PS> foo ([MyEnum]::A)
A
您需要围绕参数的括号将参数解析为Type。这是必需的,因为参数被或多或少地视为字符串。知道了这一点,你也可以用一个简单的字符串形式传递它们,并且PowerShell会弄清楚:
C:\PS> foo A
A
C:\PS> $arg = "B"
C:\PS> foo $arg
B
C:\PS> foo F
error*
错误 - F不是枚举值之一 - 有效值包括A,B,C,D *
答案 3 :(得分:0)
自PowerShell 5起,您实际上可以本地使用/创建一个ShowDialogBox("test", "testing dialog box behaviour", DialogBoxButtons.YES_NO_CANCEL, HandleResponse);
private void HandleResponse(DialogResponse response)
{
if(response == DialogResponse.YES)
{
// Do something
}
}
。
Enum
然后它的类型也将可见。
enum OS {
Windows
Linux
iOS
}
Series.view
可能是有用的链接。