Это - очень простая задача на каждом языке, который я когда-либо использовал, но я, может казаться, не понимаю это в PowerShell. Пример того, о чем я говорю в C:
abs(x + y)
Выражение x + y
оценен, и результат передал abs
как параметр..., как я делаю это в PowerShell? Единственным путем я выяснил, до сих пор должен создать временную переменную для хранения результата выражения и передачи это.
PowerShell, кажется, имеет очень странную грамматику и анализирующие правила, которые постоянно ловят меня врасплох, точно так же, как эта ситуация. Кто-либо знает о документации или учебном руководстве, которое объясняет основную базовую теорию языка? Я не могу полагать, что это все особые случаи, должна быть некоторая рифма или обосновать, что никакое учебное руководство, которое я все же прочитал, не объясняет. И да, я считал этот вопрос, и все те учебные руководства ужасны. Я был в значительной степени понижен к приобретению знаний из существующего кода.
В вашем случае, просто заключив выражение в круглые скобки, вы сможете передать его в функцию.
Это необходимо сделать, потому что 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 Брюса Пайетта (он тот парень, который стоит за грамматикой). Если вы можете подождать еще несколько месяцев (или вас устраивает электронная копия), этим летом выйдет второе издание, обновленное для PowerShell 2.0.
Вам также может быть полезна моя серия Effective PowerShell. Просмотрите пункт № 10 о Режимах разбора PowerShell.