Pat*_*ric 5 powershell settings global-variables project-structure powershell-module
我们正在使用 PowerShell(帮助我们设置一些 SharePoint 环境/租户的脚本/函数的集合)构建一个更大的项目。
许多功能应该重用存储在单个中央位置的设置。
我找不到如何最好地创建和构建此类设置文件/位置的“最佳实践”。
我的想法是将全局设置存储在单独的文件(模块文件)中,例如Settings.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 }
)
...
Run Code Online (Sandbox Code Playgroud)
在其他模块/脚本中,我总是可以包含如下设置:
# 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
...
Run Code Online (Sandbox Code Playgroud)
因此,这将使我能够在其他脚本文件内的函数中使用这样的全局设置:
Function WriteLog
{
param
(
[System.String]$LogString = "",
[System.String]$LogLevel = ""
)
WriteLogToPath -LogFileName $global:logFileName -LogString $LogString -LogLevel $LogLevel
}
Run Code Online (Sandbox Code Playgroud)
这是一个好方法吗?或者我不应该为此使用模块文件,如果不应该使用什么类型的文件?
我可能会将所有脚本/函数收集在一个模块中,并使用注册表来存储全局设置。加载模块时从注册表中读取值,并为模块中的每个设置设置具有默认值的变量,以便您可以将缺失的值写入注册表。
像这样的东西:
$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'
...
Run Code Online (Sandbox Code Playgroud)
对于仅在模块内部使用的变量,您可能需要使用script范围而不是global范围。
| 归档时间: |
|
| 查看次数: |
3160 次 |
| 最近记录: |