西门子博途编程 - 分拣器设计二。Windows PowerShell 2.0 代码调试并免去bug

对上次底分拣器,用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/

相关文章