Добавление функций PowerShell к объекту - PullRequest
1 голос
/ 13 декабря 2011

У меня есть модуль PowerShell с группой функций.

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

В командной строке я могу сделать $var = createService($string), затем вызвать update($var), и все будет работать правильно, но я не хочу заставлять пользователя не забывать использовать $var в качестве параметра.

Есть ли способ поместить эти функции в объект / класс, чтобы переменная могла храниться глобально и ссылаться внутри каждой функции, а не через параметры?

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

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

$module = {
    # The only service instance, $null so far
    $script:service = $null

    # Starts the service once and keeps its the only instance
    function Start-MyService {
        if ($null -eq $script:service) {
            "Starting service"
            $script:service = 'MyService'
        }
    }

    # Ensures the service by Start-MyService and then operates on $script:service
    function Update-MyService1 {
        Start-MyService
        "Updating service 1: $script:service"
    }

    # Ensures the service by Start-MyService and then operates on $script:service
    function Update-MyService2 {
        Start-MyService
        "Updating service 2: $script:service"
    }

    Export-ModuleMember -Function Update-MyService1, Update-MyService2
}

$null = New-Module $module

# Starting service
# Updating service 1: MyService
Update-MyService1

# Updating service 2: MyService
Update-MyService2
0 голосов
/ 14 декабря 2011

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

$module = {
    function StartNewService {
        $script:service = 'MyService'
    }
    function UpdateService {
        "Updating service: " + $script:service
    }
    Export-ModuleMember -Function StartNewService, UpdateService
}

$null = New-Module $module

# StartNewService creates the service variable.
StartNewService
# UpdateService accesses the service variable created by StartNewService.
UpdateService

Если вы объявите переменную как $global:service, вы также можете получить доступ к переменной вне модуля.

Редактировать: Чтобы обратиться к комментариям ниже, вот более практичный пример, который показывает подходящую ситуацию для разделения переменной среди функций в модуле. В этом случае все функции в модуле зависят от одного и того же экземпляра переменной $Locations. В этом примере переменная создается вне функций и является конфиденциальной, поскольку она не включена в команду Export-ModuleMember.

Вот упрощенная версия моего LocationName.psm1

$Locations = @{}

function Save-LocationName {
    param(
        [parameter(Mandatory=$true)]
        [string]$Name
    )
    $Locations[$Name] = $PWD
}

function Move-LocationName {
    param(
        [parameter(Mandatory=$true)]
        [string]$Name
    )
    if($Locations[$Name]) {
        Set-Location $Locations[$Name]
    }
    else {
        throw ("Location $Name does not exist.")
    }
}

New-Alias -Name svln -Value Save-LocationName
New-Alias -Name mvln -Value Move-LocationName

Export-ModuleMember -Function Save-LocationName, Move-LocationName -Alias svln, mvln

С помощью этого модуля пользователь может дать имя каталогу и переместиться в это место, используя данное имя. Например, если я нахожусь на \\server01\c$\Program Files\Publisher\Application\Logs, я могу сохранить местоположение, введя svln logs1. Теперь, если я изменил свое местоположение, я могу вернуться в каталог журналов с помощью mvln logs1. В этом примере было бы нецелесообразно использовать хеш-таблицу положений для ввода и вывода, поскольку функции всегда работают с одним и тем же экземпляром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...