我们正在使用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 }
)
...
在其他模块/脚本中,我可以随时包含这样的设置:
# 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
}
这是一个好方法吗?或者我不应该使用模块文件,如果不是,我应该使用哪种文件?
答案 0 :(得分:1)
我可能会收集模块中的所有脚本/函数,并使用注册表来存储全局设置。在加载模块时从注册表中读取值,并为模块中的每个设置提供具有默认值的变量,以便您可以将缺失值写入注册表。
这样的事情:
$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
范围。
答案 1 :(得分:0)
我会避免亲自使用注册表。我同意使用模块。我的方法是使用清单模块(即使用.psd1文件,该文件本质上是包含有关模块的元数据的键值哈希表),并指定一个' root'带有RootModule键的模块。
模块范围现在由此RootModule设置,您可以在那里定义变量。
您可以将自己的功能分离为“嵌套”功能。模块(另一个清单文件密钥),这些模块由PowerShell自动加载到根模块范围内,因此应该可以访问这些变量。
您甚至可以使用该清单文件中的键控制导出的变量和函数。
答案 2 :(得分:0)
检查Get-Configuration Powershell模块。概念很简单,模块添加了环境变量,其中(在JSON中)保存了类型和源的定义。
(dir env:PSGetConfiguration).Value
{
"Mode": "Xml",
"XmlPath": "C:\\Managers\\PSGetConfiguration.xml"
}
配置文件非常简单,只包含键和值项
cat $(Get-ConfigurationSource).XmlPath
<Configuration>
<conf key="ExampleKey" value="ExampleValue" />
<conf key="key" value="Value123" />
<conf key="remove" value="remove" />
</Configuration>
模块公开了两个主要功能Get-Configuration和Set-Configuration
Set-Configuration -Key k1 -Value v1
Get-Configuration -Key k1
v1
在启动模块中将XML保存在模块目录中,可以通过手动更改环境变量或使用命令Set-XmlConfigurationSource
来更改它。SQL配置
默认情况下,模块使用XML来存储数据,但第二个选项是将数据存储在SQL中。设置配置非常简单:
Set-SqlConfigurationSource -SqlServerInstance ".\sql2017" -SqlServerDatabase "ConfigDatabase" -SqlServerSchema "config" -SqlServerTable "Configuration"
在此之后,我们的配置将存储在SQL表中。
代码也可在github中找到。