将PowerShell函数添加到对象

时间:2011-12-13 19:53:24

标签: function variables object powershell

我有一个包含一组功能的PowerShell模块。

createService函数创建一个服务实例并返回一个变量。我的一些函数使用返回的值,但我只想要一个服务实例,所以我不能在每个函数中调用createService。

在命令行上,我可以$var = createService($string),然后拨打update($var)它会正常工作,但我不想强迫用户记住使用$var一个参数。

有没有办法将这些函数放在一个对象/类中,这样变量可以全局存储并在每个函数内部而不是通过参数引用?

2 个答案:

答案 0 :(得分:1)

我建议通过公开的函数启动服务,这样用户甚至可以开始使用它。

$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

答案 1 :(得分:0)

在您的模块中,如果将服务对象分配给脚本作用域变量,则模块中的所有函数都可以访问该变量。这是一个例子:

$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返回日志目录。在这个例子中,使用位置哈希表进行输入和输出是不切实际的,因为函数总是使用相同的实例。