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)
这是一个可以让您轻松检查的功能;以及一些改变行为的选项。
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)
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.BreakpointUpdated和Debugger.DebuggerStop),因此您需要查看是否有这些事件的处理程序。
如果您需要#4,您可能需要访问私有数据。唯一带有PSDebug名词的 PowerShell 3.0 命令是Set-PSDebug,这意味着没有 cmdlet 可以返回 的状态PSDebug。
如果你需要#3,那么情况与#4类似。没有 cmdlet 可返回所跟踪内容的信息。