我有一个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!"

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

    }
}

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

最佳答案

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

如果您在全局范围内的脚本中设置$ 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/

10-08 22:37