我有一些Powershell代码,如下所示:
if($item_1 -lt 2000000){
...
}
if($item_2 -lt 10000){
...
}
if($item_3 -gt 10){
...
}
if($item_4 -gt 100){
...
}
我想将它重构为像
这样的函数function doComparison( $item, $operator, $value)
但是我不确定如何将less-than和greater-than运算符传递给函数。一种解决方案是将运算符作为文本传递(例如“-lt”),然后在函数中使用if语句,但这是不优雅的。有更好的方法吗?
我接受“user2460798”的回复,因为“Invoke-Expression”是我以前不知道的概念(即能够“动态汇编代码”)。
我的代码现在看起来像我原来希望的那样:
checkLine $item_1 lt 2000000
checkLine $item_2 lt 10000
checkLine $item_3 gt 10
checkLine $item_4 gt 100
感谢大家的回复!
答案 0 :(得分:2)
您可以将脚本块作为参数传递给doComparison:
function doComparison($item, [scriptblock]$comp, $value)
{
if(invoke-command -scriptblock $comp -arg $item,$value)
{
"It's true"
}
else
{
"It's false"
}
}
并将其称为:
doComparison 2 {$args[0] -lt $args[1]} 1000
虽然这看起来不是很“优雅”。但也许如果你预定义了一堆sciptblocks:
$lt = {$args[0] -lt $args[1]}
$gt = {$args[0] -gt $args[1]}
它更接近你所追求的目标:
# > doComparison 2 $lt 1000
It's true
# > doComparison 2 $gt 1000
It's false
答案 1 :(得分:1)
我不知道传递和应用运算符的更“优雅”的方法,但我会考虑为运算符创建一个自定义枚举来保存可以传递的值,并启用tab的完成参数值。
答案 2 :(得分:1)
您可以使用Invoke-Expression。有点像这样:
function doComparison( $item, $operator, $value) {
# Notice the dash here. Example: doComparsion $item_4 lt 150
# If you try to implement it where the dash is specified on the command line
# (doComparision $item_4 -lt 150) then PS will treat -lt as a parameter name.
iex "($item) -$operator ($value)"
}
但是可能需要进行一些额外的调整来处理$ item和/或$ value是表达式的情况,但是括号应该处理常见的情况。