Назад | Перейти на главную страницу

почему в Powershell неправильно вызывать функции в круглых скобках?

Этот вопрос является продолжением комментария в другом вопросе Powershell не может получить pwdLastSet из Active Directory

Здесь я попытался вызвать функцию вот так:

 Get-PwdLastSet('grz')

Я получил следующий намек, который я искренне ценю:

... во-первых, не используйте круглые скобки () для вызова функций в PowerShell (это допустимо синтаксически, но неверно семантически). Правильный способ выполнить функцию - просто Get-PwdLastSet grz ...

Я понял. Но я хотел бы спросить - почему? Что тогда означают скобки?

Powershell - это анализируемый и интерпретируемый язык. Переводчик видит в скобках структура управления и не ожидается и не требуется на Позвонить на сайт. Рассмотрим следующий пример функции:

function test-function {

    param
    (
    [string]
    $string,

    [string]
    $word
    )

    "String: $string.  Word: $word"

}

Правильный способ вызова этой функции следующий:

Test-Function -String "Hello" -Word "World"

Создатели Powershell в Microsoft хотели создать единый новый продукт, который заменил бы оболочку cmd и vbscript. Одной из основных целей Powershell была стандартизация именования командлетов, процедуры вызова на сайте, именования переключателей и вывода (как объекта). Как ни странно, другой основной задачей было устранение недостатков безопасности vbscript.

По умолчанию командлеты Powershell Перегружен чтобы тот же пример функции можно было вызвать так:

Test-Function "Hello" "World"

Оба этих примера выведут следующее:

"String: Hello.  Word: World"

Итак, что произойдет, если мы решим использовать круглые скобки в месте вызова?

Test-Function("Hello","World")

"String: Hello World.  Word:"

Так что же случилось? Powershell интерпретировал наши входные данные как один массив, содержащий две строки, которые были переданы первой (позиционной) переменной. Чтобы получить желаемый результат в круглых скобках, вам нужно сделать следующее:

Test-Function("Hello")("World")

Мы отправляем две контролируемые структуры (по типу объекта. В данном случае они относятся к типу [String]), как указано в скобках, к функции. Это неправильно бросается в глаза, не так ли?

Надеюсь, это поможет вам понять, почему использование скобок при вызове функций и командлетов противоречит здравому смыслу.