2016-02-17 70 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 
相關問題