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

Mar*_*son 5 variables powershell

我有一个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!"
Run Code Online (Sandbox Code Playgroud)

Logging.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;}

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我运行脚本,这是输出:

PS > .\CallingScript.ps1
Debug preference: Continue
DEBUG: Checking that debugging works
Debug preference: SilentlyContinue
PS >
Run Code Online (Sandbox Code Playgroud)

Lar*_*ens 8

正如JPBlanc在其评论中的链接所解释的那样:这是一个可变范围问题.模块的作用域链直接转到全局作用域,而不是通过任何脚本作用域.即使它是从脚本导入的.

模块范围

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

$global:DebugPreference = "Continue"
Run Code Online (Sandbox Code Playgroud)

此特定$ DebugPreference案例中的另一个解决方案是使用-Debug参数传递它.缺点是你必须在你调用的每个命令中执行此操作.

Write-Log "Debug" "Checking that debugging still works!" -debug:$DebugPreference
Run Code Online (Sandbox Code Playgroud)

一个第三个解决方案是在模块级设置$ DebugPreference.

$m = Import-Module Logging -PassThru
& $m {$script:DebugPreference = 'Continue'}
Run Code Online (Sandbox Code Playgroud)