как использовать выражения в качестве параметров функции в powershell - PullRequest
5 голосов
/ 22 мая 2010

Это очень простая задача для каждого языка, который я когда-либо использовал, но я не могу понять это в PowerShell. Пример того, о чем я говорю в C:

abs(x + y)

Выражается выражение x + y, и результат передается в abs в качестве параметра ... как мне это сделать в PowerShell? Единственный способ, который я до сих пор выяснил, - это создать временную переменную для хранения результата выражения и передать ее.

Кажется, что в PowerShell очень странные правила грамматики и синтаксического анализа, которые постоянно застают меня врасплох, как и в этой ситуации. Кто-нибудь знает документацию или учебник, объясняющий основную теорию языка? Я не могу поверить, что это все особые случаи, должна быть какая-то рифма или причина, по которой ни один учебник, который я еще не прочитал, не объясняет. И да, я прочитал этот вопрос , и все эти уроки ужасны. Я в значительной степени вынужден учиться на существующем коде.

Ответы [ 2 ]

7 голосов
/ 22 мая 2010

В вашем случае простое окружение выражения круглыми скобками позволит вам передать его в вашу функцию.


Это необходимо сделать, потому что 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
3 голосов
/ 22 мая 2010

Не уверен, что я точно понимаю, с какой проблемой вы столкнулись.Ниже показано, что в 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 в действии от Брюса Пайетта (он стоит заграмматика).Если вы можете подождать еще несколько месяцев (или с электронной копией в порядке), этим летом выйдет второе издание, которое будет обновлено для PowerShell 2.0.

Вам также может пригодиться моя серия Effective PowerShell .Оформить заказ №10 при Режимах разбора PowerShell .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...