2010-05-21 47 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。

相關問題