在powershell中检查是否处于调试模式

Rya*_*tes 5 debugging powershell

如果我的脚本在调试模式下运行,如何检查powershell?我目前正在安装PowerShell Tools的Visual Studio 2015中进行调试.

脚本的一部分使用Send-MailMessage发送电子邮件.我想做类似下面的事情.

If (Debug)
{
    $messageProperties.To = "$env:username@company.com"
}
Else
{
    $messageProperties.To = "prodmailbox@company.com"
}
Run Code Online (Sandbox Code Playgroud)

我知道在C#中我可以做类似下面的事情.我想知道如何在PowerShell中处理它.

#if DEBUG
    // Debug code
#endif
Run Code Online (Sandbox Code Playgroud)

Joh*_*van 7

这是一个可以让您轻松检查的功能;以及一些改变行为的选项。

function Test-Debug {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSBoundParameters
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnoreDebugPreference
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSDebugContext
    )
    process {
        ((-not $IgnoreDebugPreference.IsPresent) -and ($DebugPreference -ne "SilentlyContinue")) -or
        ((-not $IgnorePSBoundParameters.IsPresent) -and $PSBoundParameters.Debug.IsPresent) -or
        ((-not $IgnorePSDebugContext.IsPresent) -and ($PSDebugContext))
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是一些代码,用于在某些情况下演示输出:

#region 'Test Functions'
function Test-InheritExplicit {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSBoundParameters
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnoreDebugPreference
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSDebugContext
    )
    process {
        #if we weren't splatting all vars over, we could use this trick:
        #[switch]$DebugCopy = $PSBoundParameters.Debug
        #Test-Debug -Debug:$DebugCopy
        Test-Debug @PSBoundParameters
    }
}

function Test-InheritImplicit {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSBoundParameters
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnoreDebugPreference
        ,
        [Parameter(Mandatory = $false)]
        [switch]$IgnorePSDebugContext
    )
    process {
        Test-Debug -IgnorePSBoundParameters:$IgnorePSBoundParameters -IgnorePSDebugContext:$IgnorePSDebugContext -IgnoreDebugPreference:$IgnoreDebugPreference
    }
}
#endregion 'Test Functions'

#region 'Test Cases'
[hashtable[]]$testCases = 0..15 | %{
    [hashtable]$new = @{}
    if ($_ -band 1) {$new.Debug = [switch]$true}
    if ($_ -band 2) {$new.IgnorePSBoundParameters = [switch]$true}            
    if ($_ -band 4) {$new.IgnoreDebugPreference = [switch]$true}
    if ($_ -band 8) {$new.IgnorePSDebugContext = [switch]$true}
    $new
}

[int]$t = 0
$testCases | %{
    [hashtable]$testCase = $_
    (New-Object -TypeName PSObject -Property @{
        TestId = ++$t
        Debug = [bool]$_.Debug
        IgnorePSBoundParameters = [bool]$_.IgnorePSBoundParameters
        IgnoreDebugPreference = [bool]$_.IgnoreDebugPreference
        IgnorePSDebugContext = [bool]$_.IgnorePSDebugContext
        TD = (Test-Debug @testCase)
        TIE = (Test-InheritExplicit @testCase)
        TII = (Test-InheritImplicit @testCase)
    })
} | Format-Table  TestId, Debug, IgnorePSBoundParameters, IgnoreDebugPreference, IgnorePSDebugContext, TD, TIE, TII -AutoSize
Run Code Online (Sandbox Code Playgroud)

这是上面的输出:

TestId Debug IgnorePSBoundParameters IgnoreDebugPreference IgnorePSDebugContext    TD   TIE   TII
------ ----- ----------------------- --------------------- --------------------    --   ---   ---
     1 False                   False                 False                False False False False
     2  True                   False                 False                False  True  True  True
     3 False                    True                 False                False False False False
     4  True                    True                 False                False  True  True  True
     5 False                   False                  True                False False False False
     6  True                   False                  True                False  True  True False
     7 False                    True                  True                False False False False
     8  True                    True                  True                False False False False
     9 False                   False                 False                 True False False False
    10  True                   False                 False                 True  True  True  True
    11 False                    True                 False                 True False False False
    12  True                    True                 False                 True  True  True  True
    13 False                   False                  True                 True False False False
    14  True                   False                  True                 True  True  True False
    15 False                    True                  True                 True False False False
    16  True                    True                  True                 True False False False
Run Code Online (Sandbox Code Playgroud)


Χpẘ*_*Χpẘ 4

PowerShell 中的“已调试”可能意味着多种含义。1) 程序在调试器下运行,2) cmdlet/函数是否传递标志-Debug3 ) PowerShell 跟踪已打开,4) Set-PSDebug 用于切换跟踪(与 #3 不同的跟踪类型)。$DebugPreferencesSilentlyContinue

如果您还没有选择其中之一,我建议您选择#2。它很简单(检查-Debugis inPSBoundVariables或 value of $DebugPreferencesis not SilentlyContinue)。它支持Write-Debugcmdlet。一般来说,这是切换调试输出的类似 PowerShell 的方式。

如果您确实需要#1,那么正如本页所述,实现 PowerShell 调试器的核心是处理两个事件(Debugger.BreakpointUpdatedDebugger.DebuggerStop),因此您需要查看是否有这些事件的处理程序。

如果您需要#4,您可能需要访问私有数据。唯一带有PSDebug名词的 PowerShell 3.0 命令是Set-PSDebug,这意味着没有 cmdlet 可以返回 的状态PSDebug

如果你需要#3,那么情况与#4类似。没有 cmdlet 可返回所跟踪内容的信息。