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

Can I pipe into a switch statement stored in a variable?

提问人:I am Jakoby 提问时间:12/1/2022 最后编辑:Santiago SquarzonI am Jakoby 更新时间:12/1/2022 访问量:79

问:

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

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

我正在尝试输入数字以运行 switch 语句

像这样:

1 | iex($com)

PowerShell switch-statement 脚本块

评论


答:

3赞 Santiago Squarzon 12/1/2022 #1

您的选择包括:

  1. 具有进程块的脚本块函数
$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 thing {
    switch ($_) {
        1 { "one."   }
        2 { "two."   }
        3 { "three." }
    }
}

1..3 | thing
  1. 使用 ScriptBlock.Create 方法(这需要字符串表达式中的块):process
$com = '
process {
    switch ($_) {
        1 { "one."   }
        2 { "two."   }
        3 { "three." }
    }
}
'

1..3 | & ([scriptblock]::Create($com))
  1. 使用 ScriptBlock.InvokeWithContext 方法自动变量 $input,此技术不会流式传输,并且还需要一个外部才能工作,它只是为了展示,应该作为一个选项丢弃:scriptblock
$com = '
switch ($_) {
    1 { "one."   }
    2 { "two."   }
    3 { "three." }
}
'

1..3 | & { [scriptblock]::Create($com).InvokeWithContext($null, [psvariable]::new('_', $input)) }
  1. 使用 Invoke-Expression,还需要一个带有块的外部(应该丢弃 - 从上面显示的所有技术来看,这是最糟糕的技术,正在评估通过管道传递的每个项目的字符串表达式):scriptblockprocess
$com = '
switch ($_) {
    1 { "one."   }
    2 { "two."   }
    3 { "three." }
}
'

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