betway体育西门子博途编程 - 分拣器设计二。Windows PowerShell 2.0 代码调试并消除bug

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

从来不其余脚本或程序能够管在另情况下毫不错误地履,在外侧条件转之动静下,需要防或者出错的处。本文将着重讲解如何调节PowerShell代码,即找并消除bug,这是每个开发人员都应熟练掌握的技能。在本文将介绍PowerShell提供的缓解措施,以及诊断及预防错误的道,以要程序更为健全和平静。

betway体育 1

大部编程语言及条件提供了整调试特性的系统,可以逐步跟踪程序的推行,保证所有的履行过程可约定的算法。然而PowerShell并从未提供脚本调试程序,这样开发人员必须用任何手段来调节错误。可以经过有些精彩纷呈的手法近乎于对先后的逐年调试,临时挂于施行流并检查程序状态。

betway体育 2

对此有些苛的职责,通常情况下会将顺序细化分解为多只相对独立的子模片来检查各自的功力。分解后的模块之间要尽可能不带有了多耦合,这样才未见面当调节时造成极其多之麻烦。

betway体育 3

1 打印调试

betway体育 4

经过打印来调试程序是最好老且很实惠之调剂方法,尽管这种艺术相对比较麻烦,但是就是开发人员编程所急需的底子。打印调试检查程序的实行状态,并以一定的推行流中添加注入代码打印当时网的有关消息,然后用这些消息与预期的信息进行比较。这是同样栽强大的调试方法,基本上适用于各种编程语言。在PowerShell中要检查的情节囊括剧本变量、环境变量、文件内容及报表键值等,潜在的胁是易失去控制或引入运行时之逻辑错误。有效控制的关键在于保持注入的输出语句逻辑简单,并分模块调试。

最有益之打印调试工具是Write-Host,它将出口对象或字符串直接出口及控制台,而非会见传送至对象管道被。该工具得以出口各种类型的靶子及聚合,使用不同的颜料区分内容连通报用户眼前操作的生死存亡系数。如用绿色代表诊断信息,红色代表警告等。这是透过设定BackgroundColor和ForegroundColor属性实现之,这点儿个属性之取值包括Black、DarkBlue、DarkGreen、DarkCyan、DarkRed、DarkMagenta、DarkYellow、Gray、DarkGray、Blue、Green、Cyan、Red、Magenta、Yellow和White。

betway体育 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

betway体育 6

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

这顺序包含2只关键的交互状态机,两独状态机之间是生关系的。通过互的状态激活。

betway体育 7

就看似状态机转换成程序一般发生下几乎种植写法:

(1)生成详细输出

  • 同样种是拿具有程序写以一个片里,但个别用鲜只stepNumber,但这么自然造成函数片的效能最多,不妥。

  • 任何一样栽是管传送带和旋转平台分开写,它们中间的交互用全局变量通信。每个片功能单一,容易保障。

洋洋时光需要输出一些用户并不需要看到底确诊信息为是。而且会使控制高屏幕杂乱无章,为之要来主意变易于打开和关的确诊信息。PowerShell提供了适应诊断的cmdlet,包括Write-Verbose、Write-Warning和Write-Debug。Write-Verbose的用法如图2所显示。

此间选择的是第二种。

betway体育 8

更旋转平台被,一旦闹超时报警,就吊于步进程序,输出错误。等待故障恢复,按alarmReset后,继续上次的步进。另外比从以前的顺序,增加了手上步之显得,可以了解及函数片被之步之行情况。程序调试起来较费心,很多信号要联动,我只是简短调试了瞬间,但为解除了广大谬误。如果用于现场,后果自负。

盖默认情况下关闭Write-Verbose输出,所以第1实施吃之Write-Verbose执行后连没有拿字符打印至控制台。如果欲打印及控制台,则要图中第3尽所显示在cmdlet后搭-Verbose参数。由于每个输出需要在调节时去除或追加-Verbose参数,所以并没有减掉工作量。PowerShell提供了全局变量$VerbosePreference,默认值为SilentlyContinue。为了能见到输出,需要用那反吧Continue,如图2所著之末段两个令。

自身认为更是转平台的筹划,可以做成模版。方便其它步进程序的录用。个人感觉已经大到了。如产生必不可少可以重新加个原位,作为输入管脚,条件写于函数片他,方便调试。

$VerbosePreference的取值还连Stop和Inquire,为Stop,Shell将见面扭转停止错误并会阻拦剩余代码的实行;为Inquire,Shell将会晤了解用户如何实施下一样步操作,如图3所展示。

betway体育 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所出示。

betway体育 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所显示。

betway体育 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所展示。

betway体育 12

好观看第2只函数通过调用形式进入函数,但连从未出口其相关属性,这是由代码触发了那个。可以以$DebugPerference设置也Inquire挂起剧本的履,并查阅里面的运作条件。这对获得有错误的附加信异常有因此,图7所展示为调试的经过。

betway体育 13

得看到在履进程中经过逐条确认命令可以悬挂于先后的尽,以检讨运行的连带规则。在程序中可以检查$file变量值,在背后的调用中得以视打开nosuchfile.txt文件时出现错误。然后使用exit命令退出嵌套的命令提示符,返回到Write-Debug的命令提示符下。这是好实惠的同样栽机制,类似调试程序时行使的断点。

(3)生成警告

警告是平等种植诊断输出的花样,主要针对急需查阅的非危机性信息。警告信息一般意味着脚本的运转的条件受到在问题,但是脚本可能清楚怎么样处理这些题材。并且以会晤继续执行,向用户传达信息。一旦脚论实施有误,用户会了解哪些处理。Write-Warning是出口警告信息之cmdllet,如图8所显示。

betway体育 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所出示。

betway体育 15

当要检测的文书不存时时显得相应的提示,使用户明确知晓问题所在。如果用户对这些内容不感兴趣,也得以选择用那倒闭。

(4)控制不当输出

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

betway体育 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所著。

betway体育 17

自打达图中好看看而当程序执行的旁一样步挂于实施,并以嵌套的唤醒符下检查环境的叠加信,检查后得以用exit命令退出嵌套的命令提示符。为了回正常的Shell,可能用再开Shell进程要传递Off参数调用Set-PSDebug关闭调试模式,如图12所显示。

betway体育 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所出示。

betway体育 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所展示。

betway体育 20

可以看出在实施的进程被首先定义了Calculate函数,并于后面第7执调用这个函数,然后以第3尽及第4行执行函数的测算操作。如果以跟踪的等级改呢2,则履行结果一旦图15所著。

除行数和履行日志,还可落给调用脚本和函数的连带消息,以及变量赋值的日志,这是出口日志中隐含的!起及之来意。需要强调的凡可以经过表达式方式赢得复杂脚本的内容,并经这些信息调试函数称闯以及免必要之函数重载。

级别2方可供命令执行的详细的里信息,图16所著为获之Get-Children执行之详细信息。

betway体育 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所显示。

betway体育 22

里面所著之gal命令最后解析为Get-Allias
cmdlet,在重复特别层次可看Get-Alias被称呼也“Microsoft.PowerShell.Commands.GetAliasCommand”的.NET类执行,而PSHost参数通知Trace-Command将日志音输出及控制台。

脚演示当调用cmdlet时怎样拿变量绑定到cmdlet的参数,仍然使同样之一声令下,只是将零件名换为ParameterBinding,执行结果而图18所展示。

betway体育 23

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

最终用Trac-Command获取有关路强制转换的信息,需要跟的组件变为TypeConversion。图19所出示为以测算表达式时取隐式类型转换信息的方法。

betway体育 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/

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website