如何在powershell中使用表达式作为函数参数

时间:2010-05-21 20:58:27

标签: powershell parameters function

这是我用过的每种语言都非常简单的任务,但我似乎无法在PowerShell中弄明白。我在C中谈论的一个例子:

abs(x + y)

评估表达式x + y,结果传递给abs作为参数...我如何在PowerShell中执行此操作?到目前为止,我唯一想到的方法是创建一个临时变量来存储表达式的结果,然后传递它。

PowerShell似乎有非常奇怪的语法和解析规则,不断让我惊讶,就像这种情况一样。有没有人知道解释语言基本理论的文档或教程?我无法相信这些都是特殊情况,必须有一些押韵或理由,我还没有阅读过的教程解释。是的,我读过this question,所有这些教程都很糟糕。我几乎被降级为从现有代码中学习。

2 个答案:

答案 0 :(得分:7)

在您的情况下,只需用括号括起表达式就可以将它传递给函数。


您需要执行此操作,因为PowerShell具有多种解析模式,具体取决于命令的开头。

表达式模式类似于大多数其他语言解析的方式 - 数字是数字和字符串被引用。

命令模式将所有内容视为字符串,但变量和括号除外。这里的字符串不需要引用。

1+2          Expression mode - starts with number
"string"     Expression mode - starts with quote
string       Command mode - starts with letter
& "string"   Command mode - starts with &
. "string"   Command mode - starts with . and a space
.123         Expression mode - starts with . and number (without space)
.string      Command mode - starts with a . that is part of a command name

您可以通过用括号括起命令来在一行中混合模式。

如果您通过以下方式定义函数abs,则可以看到此效果:

function Abs($value)
{
    Write-Host $args
    if($value -lt 0) { -$value } else { $value }
}

Abs 1 + 2
#Prints:  + 2
#Returns: 1

Abs 1+2
#Prints:  
#Returns: 1+2

Abs (1 + 2)
#Prints:  
#Returns: 3

Abs (1+2)
#Prints:  
#Returns: 3

答案 1 :(得分:3)

不确定我是否完全遵循您遇到的问题。以下显示这在PowerShell中按预期工作:

PS> function abs($val) {Write-Host "`$val is $val"; if ($val -ge 0) {$val} `
                                                    else {-$val}}
PS> abs (3+4)
$val is 7
7

关于该语言的最佳文档,我强烈推荐Bruce Payette的Windows PowerShell in Action(他是语法背后的人)。如果您可以再等几个月(或者可以使用电子版本),那么今年夏天将推出针对PowerShell 2.0的第二版。

您可能还会发现我的Effective PowerShell系列有用。查看PowerShell Parsing Modes上的第10项。