针对上次的分拣器,用LAD改写了。转换的主意要看前面的帖子。这里我们一直上先后。

尚未其它脚本或程序能够管在其余动静下毫不错误地执行,在外界条件变化的状下,需要防可能出错的处。本文将重要讲解如何调节PowerShell代码,即找并清除bug,这是每个开发人员都应熟练掌握的技艺。在本文将介绍PowerShell提供的缓解方法,以及诊断和防范错误的章程,以使程序更为强壮和长治久安。

图片 1

大多数编程语言与条件提供了一体化调试特性的系统,可以逐渐跟踪程序的实施,保证拥有的实践过程符合约定的算法。然而PowerShell并无供脚本调试程序,这样开发人员必须下其他手段来调节错误。可以通过一些都行的伎俩近乎于对先后的逐步调试,临时挂于执行流并检查程序状态。

图片 2

对此部分繁杂的任务,通常情况下会将次第细化分解为多只相对独立的子模片来检查各自的功用。分解后的模块之间如果尽量不含了多耦合,这样才未见面当调节时造成极其多之辛苦。

图片 3

1 打印调试

图片 4

由此打印来调试程序是无与伦比老且颇行之调试方法,尽管这种办法相对比麻烦,但是及时是开发人员编程所要的根基。打印调试检查程序的施行状态,并当一定的实施流中添加注入代码打印当时系的连锁消息,然后以这些信与预期的音进行比。这是一致种强大的调节方法,基本上适用于各种编程语言。在PowerShell中需检查的情节囊括剧本变量、环境变量、文件内容及挂号表键值等,潜在的胁是轻失去控制或引入运行时之逻辑错误。有效控制的关键在于保持注入的出口语句逻辑简单,并分割模块调试。

无限有利之打印调试工具是Write-Host,它用出口对象或字符串直接出口及控制台,而不见面传递到对象管道遭。该工具得以出口各种类型的目标及集聚,使用不同的水彩区分内容并通报用户眼前操作的险恶系数。如用绿色代表诊断信息,红色代表警告等。这是经设定BackgroundColor和ForegroundColor属性实现之,这简单单特性的取值包括Black、DarkBlue、DarkGreen、DarkCyan、DarkRed、DarkMagenta、DarkYellow、Gray、DarkGray、Blue、Green、Cyan、Red、Magenta、Yellow和White。

图片 5

创造名也“Prite-Debug.ps1”的台本文件计算并分别用异样的前景色和背景色显示文本文件中之字符数量。在该脚本中定义名为“Count-Characters”的函数,代码如下:

function Count-Characters($file)
{
Write-Host "Opening $file" -Background White -Foreground DarkGreen
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
Write-Host "File contains $($content.Length) characters" `
-Background White -Foreground DarkGreen
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

图片 6

里的函数默认定义Content字符串,首先用Test-Path
cmdlet检查文件是否是。如果有,则使Get-Content
cmdlet读博文件之始末。函数中之所以白色的背景色和深绿色的前景色分别于开拓文件前与读取文件后输出两履行诊断信息,脚本执行结果而图1所显示。

本条顺序包含2独关键的互相状态机,两个状态机之间是产生涉嫌的。通过互动的状态激活。

图片 7

立即看似状态机转换成程序一般生下面几乎栽写法:

(1)生成详细输出

  • 一如既往栽是管持有程序写以一个块里,但各自就此单薄单stepNumber,但这样定造成函数块的效应最多,不妥。

  • 外一样栽是将传送带和转平台分开写,它们中间的并行用全局变量通信。每个片功能单一,容易保障。

博时需要输出一些用户并不需要看到的诊断信息吗夫。而且会如控制高屏幕杂乱无章,为这要有艺术变易于打开和关的诊断信息。PowerShell提供了适应诊断的cmdlet,包括Write-Verbose、Write-Warning和Write-Debug。Write-Verbose的用法如图2所出示。

这里选择的凡第二种。

图片 8

一发旋转平台遭遇,一旦闹过报警,就吊于步进程序,输出错误。等待故障恢复,按alarmReset后,继续上次的步进。另外比从以前的顺序,增加了脚下步之亮,可以了解及函数片被的步之行情况。程序调试起来比较累,很多信号要联动,我只是简单调试了瞬间,但为驱除了过多错。如果用于现场,后果自负。

以默认情况下关闭Write-Verbose输出,所以第1尽被之Write-Verbose执行后并从未将字符打印至控制台。如果需要打印及控制台,则使图备受第3履行所著在cmdlet后加-Verbose参数。由于每个输出需要在调节时去除或增加-Verbose参数,所以并没抽工作量。PowerShell提供了全局变量$VerbosePreference,默认值为SilentlyContinue。为了能看出输出,需要将那个转移吗Continue,如图2所展示之最终两只指令。

自己以为更加是转平台的规划,可以做成模版。方便其它步进程序的录取。个人感觉已经非常完善了。如发生必要可以重复加个原位,作为输入管脚,条件写在函数片他,方便调试。

$VerbosePreference的取值还连Stop和Inquire,为Stop,Shell将会变动停止错误并会拦剩余代码的施行;为Inquire,Shell将见面了解用户如何履行下一致步操作,如图3所出示。

图片 9

动Write-Verbose的裨益是可以当用时实施同一条命令打开所有的调试信息,而于无需出示时也不过便宜地关,常用之少数个值即打开和倒闭输出的Continue和SilentlyContinue。

改Count-Characters函数,在调用之后就转移详细的调试信息。将脚本保存也“Print-DebugVerboseOn.ps1”文件,代码如下:

function Count-Characters($file)
{
$functionName = $MyInvocation.MyCommand.Name
Write-Verbose "Entering $functionName"
Write-Host "Opening $file" -Background White -Foreground DarkGreen
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
Write-Host "File contains $($content.Length) characters" `
-Background White -Foreground DarkGreen
Write-Verbose "Leaving $functionName"
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

里涵盖调试信息,在调试时只有需要以变量$VerbosePreference的价设置也Continue。如果如关张调试信息,则装也SilentlyContinue,脚本执行结果使图4所显示。

图片 10

上述代码有比强之诊断信息功能,但是当调试时索要将该放在调节的代码中,工作量比生。为釜底抽薪这题目,创建名吧“Print-DebugWithInstrument.ps1”脚本。在其中定义一个名也“Instrument-Function”的函数,使用下本块封装原始之函数体。该函数包含用于诊断的代码,并当调用原始函数体前后分别生成祥的出口信息。这些调试信息需要继续放在源代码中,代码如下:

function Instrument-Function($body)
{
$parentInvocation = Get-Variable MyInvocation -scope 1 -ValueOnly
$functionName = $parentInvocation.MyCommand.Name
Write-Verbose "Entering $functionName"
&$body
Write-Verbose "Leaving $functionName"
}
function Count-Characters($file)
{
Instrument-Function {
Write-Host "Opening $file" `
-Background White -Foreground DarkGreen
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
Write-Host "File contains $($content.Length) characters" `
-Background White -Foreground DarkGreen
}
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

可观看Count-Character函数的定义及前面的代码基本相似,唯一不同是原始代码在底下本块中查封装,然后传递给Instrument-Function处理。Instrument-Function需要函数名生成诊断输出信息,这是透过Get-Variable
cmdlet在父作用域中找调用信息来实现的。上述代码的推行结果与达只实例相同,这样全优地出口了详细信息。由于新的脚本块中莫分包原始自动变量$Args,所以无法作用为无命名函数参数。

(2)生成调试输出

调节输出是本子调试信息同于独特之同一种,不同为前方的详细输出信息,调试信息只是适用于脚本作者。即使是高档用户为特别麻烦由这些调试信息中赢得到所急需的来因此信息,因为调试信息会含有内在的荒谬、中间变量的情及另外有助于脚本作者追寻出bug和大的信息。

可以经过Write-Debug cmdlet生成调试信息,如图5所著。

图片 11

默认关闭调试信息,如果一旦开拓,需要以本子最后加加-Debug参数。当Shell收到调试输出的请求时,将会见朝用户确认下一样步的操作。与$VerbosePreference类似,Write-Debug也出一个用于控制的目标$DebugPreference,默认值也为SilentlyContinue。在齐一个实例中经长-Debug参数得到认同消息,即将该对象的价设置也Inquire,并拿该安为Continue来获取简单的消息。

为了通过扩张Instrument-Function来捕获所有或由于函数体抛来的错,创建名也“Print-DebugOutput.ps1”脚本。在里面修改Count-Characters函数在文件未存的事态下摒弃来很,代码如下:

function Instrument-Function($body)
{
$parentInvocation = Get-Variable MyInvocation -scope 1 -ValueOnly
$functionName = $parentInvocation.MyCommand.Name
trap
{
Write-Debug "$functionName raised an error"
}
Write-Verbose "Entering $functionName"
&$body
Write-Verbose "Leaving $functionName"
}
function Count-Characters($file)
{
Instrument-Function {
Write-Host "Opening $file" `
-Background White -Foreground DarkGreen
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
else
{
throw "No such file"
}
Write-Host "File contains $($content.Length) characters" `
-Background White -Foreground DarkGreen
}
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

本子执行结果一旦图6所著。

图片 12

足见见第2只函数通过调用形式进入函数,但连没出口其有关属性,这是由于代码触发了颇。可以用$DebugPerference设置也Inquire挂起剧本的施行,并查阅里面的运作条件。这对获得有误的叠加信挺有因此,图7所展示为调试之经过。

图片 13

得视于推行进程被经过各个确认命令可以悬挂于先后的执行,以检查运行的相关标准。在程序中可以检查$file变量值,在后边的调用中得以看到打开nosuchfile.txt文件时起谬误。然后使用exit命令退出嵌套的命令提示符,返回到Write-Debug的命令提示符下。这是甚实用之一致种植体制,类似调试程序时采取的断点。

(3)生成警告

警告是千篇一律栽诊断输出的形式,主要针对需要查阅的非危机性信息。警告信息日常意味着脚本的运作的环境中是问题,但是脚本可能知道如何处理这些题目。并且将会见继续执行,向用户传达信息。一旦脚论实施有误,用户会知道什么样处理。Write-Warning是出口警告信息的cmdllet,如图8所展示。

图片 14

默认情况下,警告通过决定高出口。也得以由此全局变量$WarningPreference来控制是否出示警告信息,其默认值为Continue。可以经过将那个设置为SilentlyContinue来忽略警告信息或设置也Inquire来逐句调试脚本,检查及时的施行状况。

当Count-Characters函数中丢掉来之老大并无合适,因为未设有文件之大大小小也零字节是正常的。这里运用警告来唤起用户越来越适合,下面改写脚论并取名也“Print-Warning.ps1”,代码如下:

function Instrument-Function($body)
{
        $parentInvocation = Get-Variable MyInvocation -scope 1 -ValueOnly
        $functionName = $parentInvocation.MyCommand.Name
        trap
        {
            Write-Debug "$functionName raised an error"
        }
        Write-Verbose "Entering $functionName"
        &$body
        Write-Verbose "Leaving $functionName"
}
function Count-Characters($file)
{
        Instrument-Function {
        Write-Host "Opening $file" `
        -Background White -Foreground DarkGreen
        $content = ""
        if (Test-Path $file)
        {
            $content = Get-Content $file
        }
        else
        {
            Write-Warning "$file does not exist."
        }
Write-Host "File contains $($content.Length) characters" `
-Background White -Foreground DarkGreen
        }
}

Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

运行脚本并先后设置$WarningPreference对象的情节,这样即可见到调试信息,执行结果如果图9所出示。

图片 15

当要检测的文书未设有时时显得相应的唤醒,使用户明确知晓问题所在。如果用户对这些内容不感兴趣,也可以选用那关闭。

(4)控制不当输出

Write-Verbose、Write-Debug和Write-Warning由于对不当信息之覆盖面不同,所以适用于不同之调节以及以场所;另外一个类的cmdlet是Write-Error,也得据此那全局变量$ErrorActionPreference来支配输出内容,如图10所著。

图片 16

若图被所展示,在闹不明不白错误时得经过安装$ErrorActionPreference的值吗Inquire挂起嵌套的履代码来查看这之一无是处所于。

2 步向前调试脚本和间断执行

步迈进调试代码是代码执行的新鲜状态,会当各国一行代码执行之前询问用户下一致步操作。表面上看起如此实践是异常麻烦的,但以碰到程序错误时也甚有效。在每个语句前添加Set-PSDebug来实现步进调试,Count-Characters.ps1下面论中含Count-Characters函数,代码如下:

function Count-Characters($file)
{
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
Write-Host "File contains $($content.Length) characters"
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

为了逐个语句步进通过合脚本,需要以实践脚本之前调用带有Step参数的Set-PSDebug的cmdlet,执行结果一旦图11所出示。

图片 17

于达到图备受得以视而每当程序执行的其它一样步挂于执行,并于嵌套的提拔符下检查环境之附加信,检查后方可用exit命令退出嵌套的命令提示符。为了回正常的Shell,可能需要重开Shell进程要传递Off参数调用Set-PSDebug关闭调试模式,如图12所著。

图片 18

PowerShell本身不支持断点,但是足以经挂于剧本的履行并启动嵌套的提拔称查询变量内容还是修改环境的款型模仿设置断点。下面创建新的脚本,并取名吧“Count-CharactersDebug.ps1”,代码如下:

function Start-Debug
{
Write-Host "Breakpoing hit!" -ForegroundColor Red
function prompt
{
"DEBUG> "
}
$host.EnterNestedPrompt()
}
function Count-Characters($file)
{
$content = ""
if (Test-Path $file)
{
$content = Get-Content $file
}
else
{
Start-Debug
}
Write-Host "File contains $($content.Length) characters"
}
Count-Characters Print-Debug.ps1
Count-Characters nosuchfile.txt

上述代码执行时以革命标识debug信息,以分别外消息。可以当使得嵌套调试提示信息更加明确,便于提示用户注意,执行结果如果图13所展示。

图片 19

3 跟踪脚本执行细节

PowerShell最强大的功效有是由此跟命令执行来诊断及缓解之中存在的错误,所有调试之力量是吧脚本开发人员、cmdlet开发人员或者高档用户准备的。这些用户会跟详细的操作日志,包括Shell本身及其cmdlet。在PowerShell中能观察到个别看似跟踪日志,一凡是Shell的里操作,如设置变量和调用函数的;二凡其他能够得到到跟的指定操作。

(1)跟踪Shell内部操作

钉住脚本需要操作的系信息以及实施之依次,要调用Set-PSDebug
cmdlet并传递Trace参数将Shell切换至跟模式。PowerShell提供1同2点儿栽级别之跟办法,后一致种植会扭转更详尽的输出。下面创建名也“Trace-Command.ps1”的脚本文件,其中含有两独数相除的操作函数Calculate,代码如下:

function Calculate($a, $b)
{
$result = $a / $b
return $result
}
Calculate 1 2

以取脚本执行之所在行,将开关的跟踪切换到等级1的调试状态,执行结果一旦图14所显示。

图片 20

可以视于尽之进程被首先定义了Calculate函数,并在背后第7执行调用这个函数,然后以第3实施和第4实施执行函数的计量操作。如果将跟的流改吗2,则执行结果而图15所著。

除却行数和执行日志,还可以获得给调用脚本和函数的有关消息,以及变量赋值的日记,这是出口日志被寓的!起至的意图。需要强调的是得经表达式方式获得复杂脚本的内容,并由此这些消息调试函数叫闯与莫必要的函数重载。

级别2好提供命令执行之详尽的中间消息,图16所著为获得之Get-Children执行之详细信息。

图片 21

每当程序执行时能够看到返回大段的日记,从中可以视Get-ChildItem执行时当后台触发了有扑朔迷离的操作,如计量文件访问属性相关的权限值为出口文件之Mode字符串,以及获得LastWriteTime并经过采用System.String.Format的.NET方法换为字符串。一旦设置了调剂状态,就会见在另cmdlet执行之长河遭到输出相关的一部分详细信息,这在调节时特别有因此。为了重载普通的Shell操作状态,可以再开Shell进程要调用Set-PSDebug
–Off命令。

(2)跟踪特定操作

PowerShell允许跟踪其组件的特定操作,用户可以落命令执行之连带信息或者在提拔符下键入特定函数、脚本块、绑定参数的cmdlet,以及显式或隐式类型转换后Shell调用的通令。为了得到这些信息,需要动用Trace-Command这个cmdlet。

第一采取Trace-Command获取在履gal
ii命令时需要调用命令的音,为这个需要跟CommandDiscovery组件,执行结果如果图17所展示。

图片 22

中间所出示之gal命令最后解析为Get-Allias
cmdlet,在再度甚层次可见到Get-Alias被称之为吧“Microsoft.PowerShell.Commands.GetAliasCommand”的.NET类执行,而PSHost参数通知Trace-Command将日志音输出到控制台。

下演示当调用cmdlet时怎么拿变量绑定到cmdlet的参数,仍然使用相同的授命,只是用零件名换为ParameterBinding,执行结果要图18所著。

图片 23

ii的值为看做职务与Name参数来分析。检查是不是发生参数缺失之后,Shell通过调用BeginProcessing、ProcessRecord和EndProcessing的逐一吗该cmdlet执行管道,这些手续类似函数、脚本和脚本块中操作管道的begin、process和end。

末了使Trac-Command获取有关路强制转换的消息,需要跟的零部件变为TypeConversion。图19所显示为在盘算表达式时取隐式类型转换信息之点子。

图片 24

自图备受可以看返回的信息遭含PowerShell会将1起integer转换为double类型,并各自品尝隐式和显式的类型转换。

万一非小心用命令跟踪,将会获得大量空头的信息。通常状态下冒出在其他艺术无法缓解之问题时常,才见面使用调试模式来拍卖。

4 总 结

错误处理和本子调试之主题相错综复杂地提到在一齐,加强脚本的错误处理逻辑后得以实现代码的自诊断。这样即可减少脚本的调节工作,快速而中地达到目标需求。同样也得通过错误处理的连锁技术,如左陷阱输出错误信息来快速调试程序。

呢代码添加好的错误处理处理体制是开发人员应该专注的问题,这样能够大大缩短调试的工夫,而且其他利用代码的丁犹足以从中受益。本文将主要讲解了调节PowerShell代码,即找并清除bug,这是每个开发人员都应有熟练掌握的技艺。在本文还介绍了PowerShell提供的化解方法,以及诊断与防止错误的措施,以要程序更为健康和稳定性。

 

赛迪网专稿地址:http://news.ccidnet.com/art/32859/20100708/2109237_1.html

 

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保留作者的著述热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留这个段子声明;必须在文章被给闹原文连接;否则必究法律责任
村办网站: http://txj.shell.tor.hu/

相关文章

网站地图xml地图