2016-02-17 34 views
3

如果我的脚本在调试模式下运行,如何检查powershell?我目前正在使用安装了PowerShell工具的Visual Studio 2015进行调试。检查PowerShell中是否处于调试模式

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

If (Debug) 
{ 
    $messageProperties.To = "$env:[email protected]" 
} 
Else 
{ 
    $messageProperties.To = "[email protected]" 
} 

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

#if DEBUG 
    // debug code 
#endif 
+0

而不是猜测,可能你只是通过一个开关脚本告诉它当前状态(即“调试”或“释放”)。您可以将交换机的默认设置为“调试”。 – rrirower

+0

[在Cmdlet中,如何检测Debug标志是否已设置?]可能的重复(http://stackoverflow.com/questions/9895163/in-a-cmdlet-how-can-i-detect-if- -debug-flag-is-set) –

回答

3

PS中的“调试”可能意味着几件事情。 1)程序在调试器下运行,2)通过cmdlet /函数-Debug标志或$DebugPreferences不是SilentlyContinue 3)PS跟踪打开,4)Set-PSDebug用于切换跟踪(与#3不同的跟踪类型) 。

如果你还没有选择其中之一,我建议你选择#2。它很简单(检查-Debug是否在PSBoundVariables$DebugPreferences的值不是SilentlyContinue)。它支持Write-Debug cmdlet。一般而言,它是Powershell-ish方式来切换调试输出。

如果你真的需要#1,则因为这page解释,实施了PS调试器在它的核心是处理两个事件(Debugger.BreakpointUpdatedDebugger.DebuggerStop),所以你需要看是否有对这些事件的处理程序。

如果你需要#4,你可能需要访问私人数据。与PSDebug作为名词唯一的PS 3.0命令是Set-PSDebug,这意味着没有返回PSDebug状态的cmdlet。

如果你需要#3,那么情况类似于#4。没有任何cmdlets可以返回正在追踪的信息。

+0

您可以在PowerShell脚本中为每个选项提供示例吗? –

+1

让我建议,更符合SO的精神(作为解决特定编程问题的程序员资源的程序员):使用Web搜索在必要时查找示例,编写脚本。如果您遇到脚本问题,请将其添加到OP并更新您的问题。 –

1

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

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

下面是一些代码来证明在某些情况下输出:

#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 

这里是从上面的输出:

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 
相关问题