2010-05-21 52 views
3

这是我用过的每种语言中的一个非常简单的任务,但我似乎无法在PowerShell中找到它。如何在PowerShell中使用表达式作为函数参数

abs(x + y) 

表达x + y进行评估,并将结果传递给abs作为参数...我怎么做,在PowerShell中:什么我用C谈论一个例子吗?到目前为止我唯一的方法是创建一个临时变量来存储表达式的结果,并通过它。

PowerShell似乎有非常奇怪的语法和解析规则,不断地让我感到惊讶,就像这种情况一样。有没有人知道文档或教程,解释了该语言的基本基础理论?我不能相信这些都是特殊情况,必须有一些韵或理由,我还没有读过的教程解释。是的,我读过this question,所有这些教程都很糟糕。我已经差不多从现有的代码中学习了。

回答

6

就你的情况而言,只需用圆括号包围表达式就可以将它传递给你的函数。


您需要这样做,因为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 
+0

谢谢你解释模式。我不知道它甚至有不同的模式,因为我迄今发现的教程都没有提到任何这样的事情。我没有尝试parens,因为我之前遇到过一个问题,那就是用parens调用一个函数,在那里它传递了所有参数的单个数组(作为第一个参数),而不是参数在适当的位置。 – rmeador 2010-05-21 22:09:20

+1

@rmeador强烈推荐使用PowerShell :)这些模式也在那里解释。这是第1本书。 – stej 2010-05-22 12:10:49

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。

相关问题