如何在PowerShell中使用表达式作为函数参数
这是我用过的每种语言中的一个非常简单的任务,但我似乎无法在PowerShell中找到它。如何在PowerShell中使用表达式作为函数参数
abs(x + y)
表达x + y
进行评估,并将结果传递给abs
作为参数...我怎么做,在PowerShell中:什么我用C谈论一个例子吗?到目前为止我唯一的方法是创建一个临时变量来存储表达式的结果,并通过它。
PowerShell似乎有非常奇怪的语法和解析规则,不断地让我感到惊讶,就像这种情况一样。有没有人知道文档或教程,解释了该语言的基本基础理论?我不能相信这些都是特殊情况,必须有一些韵或理由,我还没有读过的教程解释。是的,我读过this question,所有这些教程都很糟糕。我已经差不多从现有的代码中学习了。
就你的情况而言,只需用圆括号包围表达式就可以将它传递给你的函数。
您需要这样做,因为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
不知道我按照你遇到的问题。下面表明,该工程预期在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
至于对语言最好的文档,我深受布鲁斯·帕耶特(他是语法背后的家伙)建议Windows PowerShell in Action。如果您可以再等几个月(或使用eletronic副本确定),那么今年夏天将推出第二版,该版本已针对PowerShell 2.0进行了更新。
您可能还会发现我的Effective PowerShell系列有帮助。在PowerShell Parsing Modes上签出项目#10。
谢谢你解释模式。我不知道它甚至有不同的模式,因为我迄今发现的教程都没有提到任何这样的事情。我没有尝试parens,因为我之前遇到过一个问题,那就是用parens调用一个函数,在那里它传递了所有参数的单个数组(作为第一个参数),而不是参数在适当的位置。 – rmeador 2010-05-21 22:09:20
@rmeador强烈推荐使用PowerShell :)这些模式也在那里解释。这是第1本书。 – stej 2010-05-22 12:10:49