gpt4 book ai didi

variables - 为什么 $DebugPreference 会在模块中丢失?

转载 作者:行者123 更新时间:2023-12-04 17:49:18 24 4
gpt4 key购买 nike

我有一个 powershell 脚本,我设置了 $DebugPreference"Continue" .但是,当我调用 Write-Debug来自从我的脚本调用的模块,$DebugPreference改为"SilentlyContinue" .这是为什么?我怎样才能保留$DebugPreference和调用脚本一样吗?下面的例子

CallingScript.ps1

$DebugPreference = "Continue"
Write-Host "Debug preference: $DebugPreference"
Write-Debug "Checking that debugging works"
Import-Module Logging;
Write-Log "Debug" "Checking that debugging still works!"

记录.psm1
Function Write-Log
{
param (
[ValidateSet("Error","Warning","Debug","Info")][String]$type,
[String]$logMessage
)
Write-Host "Debug preference: $DebugPreference"
switch($type)
{
"Error" {Write-Error $logMessage;}
"Warning" {Write-Warning $logMessage;}
"Debug" {Write-Debug $logMessage;}
"Info" {Write-Output $logMessage;}

}
}

如果我运行脚本,这是输出:
PS > .\CallingScript.ps1
Debug preference: Continue
DEBUG: Checking that debugging works
Debug preference: SilentlyContinue
PS >

最佳答案

JPBlanc's link在他的评论中解释说:这是一个可变范围问题。模块的作用域链直接进入全局作用域,而不是通过任何脚本作用域。即使它是从脚本中导入的。

module scope

如果您在全局范围内从脚本中设置 $DebugPreference,您的代码将起作用,但当然这不仅仅影响您的脚本。

$global:DebugPreference = "Continue"

在这个特定的 $DebugPreference 案例中,另一个解决方案是使用 -Debug 参数来传递它。缺点是您必须对调用的每个命令执行此操作。
Write-Log "Debug" "Checking that debugging still works!" -debug:$DebugPreference

一个 third solution将是在模块级别设置 $DebugPreference 。
$m = Import-Module Logging -PassThru
& $m {$script:DebugPreference = 'Continue'}

关于variables - 为什么 $DebugPreference 会在模块中丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21188210/

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