如何将操作符传递给Powershell中的函数

时间:2013-10-17 21:39:31

标签: function powershell parameters

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

感谢大家的回复!

3 个答案:

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