powershell - 函数中可选但互斥的开关
问题描述
我想在可以定义一些开关的自定义 powershell 模块中编写一个函数。
该函数应该在没有开关的情况下调用,或者只有一个开关。不允许多个开关。
前任:
Get-Foo -Value "text" # Should return "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate # Should return the value as date
Get-Foo -Value "42" -AsInteger # Should return 42 as integer
Get-Foo -Value "xxx" -AsDate -AsInteger # Should fail
为了支持这些情况,我正在使用参数集:
function Get-Foo{
param(
[Parameter(Mandatory=$true)]
[string]$Value,
[Parameter(ParameterSetName='AsDate')]
[Switch]$AsDate,
[Parameter(ParameterSetName='AsInteger')]
[Switch]$AsInteger
)
switch ($PsCmdlet.ParameterSetName) {
"AsDate" {
[datetime]::Parse($Value)
}
"AsInteger" {
[int]::Parse($Value)
}
"__AllParameterSets" {
$Value
}
}
}
但是,这并没有按预期工作。通过两个开关之一工作。通过两个开关失败(但这是有意的)。
完全不传递开关失败,因为它无法解析参数集。
如何解决这个问题?
解决方案
如果你给函数 a DefaultParameterSetName
,并将最后一个 switch 测试更改为Default
,事情应该可以工作:
function Get-Foo {
[CmdletBinding(DefaultParameterSetName = 'None')]
param(
[Parameter(Mandatory=$true)]
[string]$Value,
[Parameter(ParameterSetName='AsDate')]
[Switch]$AsDate,
[Parameter(ParameterSetName='AsInteger')]
[Switch]$AsInteger
)
switch ($PsCmdlet.ParameterSetName) {
"AsDate" {
[datetime]::Parse($Value)
}
"AsInteger" {
[int]::Parse($Value)
}
default {
$Value
}
}
}
结果:
Get-Foo -Value "text" # Returns "text" Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate # Returns the value as date (if Parse() is possible) Get-Foo -Value "42" -AsInteger # Returns 42 as integer (if Parse() is possible) Get-Foo -Value "xxx" -AsDate -AsInteger # Fails
注意:对于更复杂的 Switch() 比较,请考虑在break
匹配后停止比较的语句。查看about_Switch
推荐阅读
- api - 在 Flutter 中,通过 API 检索 DateTime 参数时,如何解析时间并将其从“2019-10-30T20:30:00”转换为 8:30pm?
- excel - 如何使用 VBA 组合从 CSV 中过早损坏的行?
- maven - 如何使用 Maven 构建从 Eclipse 或命令行运行集成测试
- uicollectionview - iOS Swift - 使用 UICollectionViewCompositionalLayout 检测屏幕上存在的项目
- python - 如何通过Python循环显示单个颜色条?
- c# - 如何在运行时从不同的 AppDomain 访问 Fody/Costura 嵌入式库
- powershell - 脚本应该循环通过 powershell 中的子网,并混合使用错误的 ip
- docker - Docker:创建拆卸程序
- java - 我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序
- c# - InputPane 涵盖 Context Flyout UWP