Функция PowerShell() без параметров

Вопрос или проблема

В Powershell кажется, что список параметров функции является конструктором массива, но иногда скобки () допустимы, а иногда нет, например, при вызове перегруженной функции getHashCode(). Может кто-то объяснить, что происходит с этим?

Вот простая функция и любопытные результаты:

function onBattery {
>>     if ((Get-WmiObject -Class Win32_Battery | Select-Object -ExpandProperty batterystatus) -eq 2) {
>>         write-output "Подключено"
>>     }
>>     else {
>>         write-output "На батарее"
>>     }
>> }
PS C:\tmp>
PS C:\tmp> (onBattery).getHashCode

OverloadDefinitions
-------------------
int GetHashCode()



PS C:\tmp> (onBattery).getHashCode()
62670595
PS C:\tmp> onBattery($null)
Подключено
PS C:\tmp> onBattery ($null)($null)
Подключено
PS C:\tmp> onBattery()
В строке:1 символ:11
+ onBattery()
+           ~
Ожидалось выражение после '('.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedExpression

Также, из любопытства, что нужно сделать, чтобы функция PS могла вызываться через пустое множество скобок, как это: onBattery()?

Ответ или решение

PowerShell Функции без Параметров

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

Определение функции без параметров

Для начала, давайте определим, как выглядит функция без параметров в PowerShell. Например, функция onBattery, которая не принимает никакие аргументы, выглядит так:

function onBattery {
    if ((Get-WmiObject -Class Win32_Battery | Select-Object -ExpandProperty BatteryStatus) -eq 2) {
        Write-Output "Plugged In"
    } else {
        Write-Output "On Battery"
    }
}

Данная функция проверяет статус батареи устройства и выводит соответствующее сообщение.

Как работает вызов функции

При вызове функции без параметров в PowerShell, вы можете использовать простое имя функции:

onBattery

Это верно, и такая форма вызова будет работать нормально, так как функции PowerShell могут быть вызваны с пустыми параметрами без использования скобок.

Однако, существует еще один способ вызова функции — с использованием скобок:

onBattery()

Вам уже может быть интересно, почему это не работает с вашей функцией onBattery. Давайте разберем это подробнее.

Почему не работает onBattery()

Ваша ошибка — "An expression was expected after '('" — происходит из-за того, что PowerShell ожидает, что внутри скобок будет какое-либо выражение. В случае функции, у которой нет параметров, пустые скобки не воспринимаются как допустимое выражение, что и вызывает ошибку.

Это связано со спецификой синтаксиса PowerShell. Когда вы вызываете функцию таким образом, PowerShell ожидает аргументы, а поскольку их нет, это приводит к ошибке анализа.

Необходимость скобок

Скобки в PowerShell обычно используются для вызова методов, таких как ваш пример с getHashCode(). В данном случае скобки обязательны, чтобы указать, что это метод, который нужно вызвать. Например:

(onBattery).getHashCode()

Здесь вы фактически вызываете метод класса на выходе функции, и поэтому скобки необходимы.

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

Чтобы сделать вашу функцию вызываемой через пустые скобки, можно изменить определение функции так, чтобы оно соответствовало правилам, по которым PowerShell обрабатывает вызов функций. Однако, это может выглядеть неправильно дословно и потенциально сбивать с толку. Так что лучше придерживаться стандартных практик.

Пример использования конструкций типа методов:

function onBattery {
    # Код функции
}

И обычно вы просто вызываете её как:

onBattery

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...