我有一个包含一组功能的PowerShell模块。
createService函数创建一个服务实例并返回一个变量。我的一些函数使用返回的值,但我只想要一个服务实例,所以我不能在每个函数中调用createService。
在命令行上,我可以$var = createService($string)
,然后拨打update($var)
它会正常工作,但我不想强迫用户记住使用$var
一个参数。
有没有办法将这些函数放在一个对象/类中,这样变量可以全局存储并在每个函数内部而不是通过参数引用?
答案 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
返回日志目录。在这个例子中,使用位置哈希表进行输入和输出是不切实际的,因为函数总是使用相同的实例。