powershell 我可以通过管道输入存储在变量中的switch语句吗?

brjng4g3  于 2022-12-23  发布在  Shell
关注(0)|答案(1)|浏览(137)

我有一个存储switch语句的变量

$com = '
switch ($_)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
'

我正在尝试用管道输入数字以运行switch语句
比如:
第一个月

5kgi1eie

5kgi1eie1#

您的选项包括:

  1. scriptblockfunctionprocess数据块:
$com = {
    process {
        switch ($_) {
            1 { "one."   }
            2 { "two."   }
            3 { "three." }
        }
    }
}

function thing {
    process {
        switch ($_) {
            1 { "one."   }
            2 { "two."   }
            3 { "three." }
        }
    }
}

1..3 | & $com
1..3 | thing

1.一个filter,功能完全相同:

filter thing {
    switch ($_) {
        1 { "one."   }
        2 { "two."   }
        3 { "three." }
    }
}

1..3 | thing

1.使用ScriptBlock.Create method(这需要在字符串表达式中使用process块):

$com = '
process {
    switch ($_) {
        1 { "one."   }
        2 { "two."   }
        3 { "three." }
    }
}
'

1..3 | & ([scriptblock]::Create($com))

1.使用ScriptBlock.InvokeWithContext method和自动变量$input,此技术不流,并且还需要外部scriptblock才能工作,它只是为了展示,应该作为一个选项丢弃:

$com = '
switch ($_) {
    1 { "one."   }
    2 { "two."   }
    3 { "three." }
}
'

1..3 | & { [scriptblock]::Create($com).InvokeWithContext($null, [psvariable]::new('_', $input)) }

1.使用Invoke-Expression,还需要一个外部scriptblock和一个process块(应该放弃-在上面显示的所有技术中,这是最差的一个,字符串表达式是针对通过管道的每个项进行计算的):

$com = '
switch ($_) {
    1 { "one."   }
    2 { "two."   }
    3 { "three." }
}
'

1..3 | & { process { Invoke-Expression $com } }

相关问题