1

我有一些 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)

但我不确定如何将小于和大于运算符传递给函数。一种解决方案是将运算符作为文本传递(例如“-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

谢谢大家的回复!

4

3 回答 3

3

您可以将脚本块作为参数传递给 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
于 2013-10-17T22:49:37.013 回答
2

您可以使用调用表达式。有点像这样:

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 是表达式的情况,但括号应该处理常见情况。

于 2013-10-18T05:58:58.560 回答
1

我不知道传递和应用运算符的更“优雅”的方式,但我会考虑为运算符创建一个自定义枚举以包含可以传递的值,并为参数值启用制表符补全。

于 2013-10-17T22:03:06.163 回答