PowerShell项目,将全局设置放在哪里?

标签 powershell global-variables settings project-structure powershell-module

我们正在使用 PowerShell(帮助我们设置一些 SharePoint 环境/租户的脚本/函数集合)构建一个更大的项目。

许多功能应该重用存储在一个中央位置的设置。

我找不到如何最好地创建和构造这样的设置文件/位置的“最佳实践”。

我的想法是将全局设置存储在单独的文件(模块文件)中,例如 设置.psm1 内容如下:

# Set vars
$global:scriptEnvironment = "SP2016HOSTINGDEV"
$global:logFileName = "z_Migration_to_SP2016.log"
$global:languageMapping = @{
    "en-US" = 1;
    "de-DE" = 2;
}
$global:oldWsps = @(
    [WspFile]@{ Filename = "comapany.solution.wsp"; IsDeployable = $true; IsGloballyDeployable = $false; FullTrustBinDeployment = $false },
    [WspFile]@{ Filename = "company.solution2.server.wsp"; IsDeployable = $true; IsGloballyDeployable = $false; FullTrustBinDeployment = $false }
)
...

然后在其他模块/脚本中,我总是可以包含这样的设置:
# Set vars
$scriptDirectory = Split-Path -parent $PSCommandPath

# Module import
Import-Module (Join-Path $scriptDirectory Settings.psm1) -Force -ErrorAction Stop
Import-Module (Join-Path $scriptDirectory Functions.psm1) -Force -ErrorAction Stop

# Functions
...

所以这将使我能够在其他脚本文件中的函数中使用这样的全局设置:
Function WriteLog
{
    param
    (
        [System.String]$LogString = "",
        [System.String]$LogLevel = ""
    )
    WriteLogToPath -LogFileName $global:logFileName -LogString $LogString -LogLevel $LogLevel
}

这是一个好方法吗?或者我不应该为此使用模块文件,如果不是,我应该使用哪种文件?

最佳答案

我可能会在一个模块中收集你所有的脚本/函数,并使用注册表来存储全局设置。加载模块时从注册表中读取值,并为模块中的每个设置提供具有默认值的变量,以便您可以将缺失值写入注册表。

像这样的东西:

$modulename = Split-Path $PSScriptRoot -Leaf

$default_foo = 'something'
$default_bar = 'or other'
...

function Get-RegistrySetting($name) {
    $path = "HKCU:\Software\${script:modulename}"

    if (-not (Test-Path -LiteralPath $path)) {
        New-Item -Path $path -Force | Out-Null
    }

    try {
        Get-ItemProperty $path -Name $name -ErrorAction Stop |
            Select-Object -Expand $name
    } catch {
        $val = Get-Variable -Scope script -Name "default_${name}" -ValueOnly -ErrorAction Stop
        Set-ItemProperty $path -Name $name -Value $val
        $val
    }
}

$global:foo = Get-RegistrySetting 'foo'
$global:bar = Get-RegistrySetting 'bar'
...

对于仅在模块内部使用的变量,您可能需要使用 script范围而不是 global范围。

关于PowerShell项目,将全局设置放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47790543/

相关文章:

c++ - C++静态库中的共享全局变量

javascript - var a = b = 2 和 var a = 2 之间有什么区别? var b = 2;

c# - .NET 服务的 user.config 位于何处?

android - 从 Android 小部件更改系统设置

Powershell:将多个值(带空格)传递给参数

windows - 使用PowerShell,如何将最小化的应用程序切换到正常状态?

python - 如何避免声明全局变量?

tabs - TextMate 中的选项卡行设置

Powershell:如何将过滤器值传递给gci

powershell - Azure Automation Runbook 无法将 webhook 数据解析为 JSON 对象