gpt4 book ai didi

powershell - 如何使 Powershell 模块中的变量可供该模块中的其他函数访问?

转载 作者:行者123 更新时间:2023-12-03 00:46:43 25 4
gpt4 key购买 nike

我有一个 powershell 模块,它定义了一些根据公司标准编写日志事件的基本函数,以及另一个创建日志文件应该进入的文件夹并重新启动日志记录应用程序服务的单个函数。

写入不同严重程度日志事件的每个函数都需要使用 $LogFileLocation变量(在创建文件夹、重新启动服务并通常让系统准备好开始记录的函数中设置)但 $LogFileLocation变量仅在执行设置的函数内部可用。

如何使其可用于其他函数,包括导入模块的脚本中的任何脚本函数?我试过Global:$LogFileLocation而不仅仅是 $LogFileLocation但这似乎并没有使它成为一个全局变量。

最佳答案

在你的模块中定义这个函数:

Function Set-MyModuleLogPath {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType Leaf})] #include this if you want to ensure the path exists before using (or add logic to create the path below)
[String]$Path
)
process {
(New-Variable -Name 'LogFileLocation' -Value (Resolve-Path $Path).Path -Option 'Constant' -Scope 1 -PassThru).Value
#For more info on Scope see: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_scopes
}
}

这使用 New-Variable命令将路径值分配给变量,将该变量设置为常量(假设一旦设置,您不希望其他函数在运行时更改此路径;因为这可能会导致范围广泛的变量产生不可预测的结果)。
Scope参数采用 1 的参数,这意味着这个变量的作用域是函数定义的容器;在您的情况下是模块脚本。即在模块中定义此函数,然后在运行时调用与编写 $LogFileLocation = 'c:\path\to\file.log' 的效果相同。在模块的代码中;只有您现在有办法避免在模块中对该路径进行硬编码。
ValidateScript路径上的选项具有逻辑 Test-Path $_ -PathType Leaf .即我们要确保所引用的路径有效/已经存在;并且它是一个文件,而不是一个目录。当然,您可能只想验证目录是否存在,然后在运行时创建一个新文件;或者可能创建在运行时不存在的任何东西......您可以根据需要调整此逻辑。
Resolve-Path用于以防有人传入相对路径(即 '.\default.log' ;好像工作目录在脚本运行时发生变化,this 所指的文件也会发生变化。通过在设置此位置时将其解析为绝对路径,然后锁定。

我建议不要在模块的其他地方按名称引用变量(即 $Script:LogFileLocation$LogFileLocation ),我建议添加一个 Get 方法以允许逻辑检查该变量是否已设置,然后使用它。当然,这可能是不值得的额外开销(即,如果性能比稳健性更重要)......取决于您的要求。
Function Get-MyModuleLogPath {
[CmdletBinding(DefaultParameterSetName='ErrorIfNotSet')]
param (
[Parameter(ParameterSetName='DefaultIfNotSet', Mandatory=$true)]
[switch]$DefaultIfNotSet
,
[Parameter(ParameterSetName='DefaultIfNotSet')]
[string]$DefaultPath = '.\default.log'
)
process {
try {
$path = (Get-Variable -Name 'LogFileLocation' -Scope 1 -ValueOnly -ErrorAction Stop)
} catch {
if ($DefaultIfNotSet) {
$path = Set-MyModuleLogPath $DefaultPath #once we've used the default we want it to become locked as the constant; so this log path won't change at runtime
} else {
throw "Please run 'Set-ModuleLogPath' to define a log path before calling 'Get-ModuleLogPath', or use the '-DefaultIfNotSet' switch to allow the default path to be used"
}
}
$path
}
}
  • 范围:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_scopes- - 新变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/new-variable
    获取变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/get-variable
  • 设置变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/set-variable
  • 删除变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/remove-variable
  • 清除变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/clear-variable
  • 延伸阅读:http://www.powershellatoms.com/shell-environment/constant-and-read-only-variables/
  • 关于powershell - 如何使 Powershell 模块中的变量可供该模块中的其他函数访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967480/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com