hash table/pscustomobject 而不是 switch 块

hash table/pscustomobject instead of switch block

有没有办法使用 hash table 或 pscustomobject 来代替下面的 switch 块? hash table 似乎是简化函数的好方法。

function Get-Farm
{
[cmdletbinding()]
    param (
    [parameter (Mandatory = $true)]
    [string]$farm)

Process{
        switch($farm){
            A {
                $script:startHostID = 0
                $script:endHostID = 0
            }
            B {
                $script:startHostID = 1
                $script:endHostID = 12
            }
            C {
                $script:startHostID = 13
                $script:endHostID = 24
            }

            BC {
                $script:startHostID = 1
                $script:endHostID = 24
            }

            ALL {
                $script:startHostID = 1
                $script:endHostID =48
            }
 }
 }

确实,散列table 查找是更好的选择。
Begin 块中创建查找 table 并在 Process.
中使用它 另外,参数说明中使用ValueFromPipeline,否则不要使用Process.

function Get-Farm
{
[cmdletbinding()]
param (
    [parameter(Mandatory, ValueFromPipeline)]
    [string]$farm
)
Begin {
    $lookup = @{
        A = 0,0
        B = 1,12
        C = 13,24
        BC = 1,24
        ALL = 1,48
    }
}
Process {
    if ($values = $lookup[$farm]) {
        $script:startHostID = $values[0]
        $script:endHostID = $values[1]
    }
}
}

我使用了if()里面的赋值来压缩代码,当然你也可以单独写:

$values = $lookup[$farm]
if ($values) {