我有一个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 >
答案 0 :(得分:8)
正如他在评论中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'}