как использовать выражения в качестве параметров функции в powershell

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

abs(x + y)

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

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

5
задан Cœur 22 August 2017 в 05:01
поделиться

2 ответа

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


Это необходимо сделать, потому что 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
7
ответ дан 13 December 2019 в 22:02
поделиться

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

Вам также может быть полезна моя серия Effective PowerShell. Просмотрите пункт № 10 о Режимах разбора PowerShell.

3
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: