Этот вопрос является продолжением комментария в другом вопросе 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]
), как указано в скобках, к функции. Это неправильно бросается в глаза, не так ли?
Надеюсь, это поможет вам понять, почему использование скобок при вызове функций и командлетов противоречит здравому смыслу.