-
如果一条命令可能指向两个实体,get-command也会返回,例如more。 PS C:> Get-Command more CommandType Name Definition ----------- ---- ---------- Function more param([string[]]$paths)... Application more.com C:windowsSYSTEM32more.com 这两条命令,前者是Powershell的自定义函数,后者是扩展的Application命令。细心的读者可能会提问,这两个会不会发生冲突。当然不会,默认会调用第一个,是不是仅仅因为它排在第一个,不是,而是在Powershell中有一个机制,就是函数永远处在最高的优先级。不信,看看下面的例子,通过函数可以重写ipconfig ,一旦删除该函数,原始的ipconfig才会重新登上历史的舞台查看全部
-
从用户的角度来看,在Powershell控制台上输入一条命令,然后直接回车执行,是一件简单的事情,事实上Powershell在后台做了很多事情,其中第一步,就是查看用户输入的命令是否可用,这个步骤也被称作自动化发现命令。使用Get-Command 命令可以查看当前作用域支持的所有命令。如果你想查看关于 LS 命令的信息,请把它传递给Get-Command。 PS C:> Get-command LS CommandType Name Definition ----------- ---- ---------- Alias ls Get-ChildItem 如果你想查看更加详细的信息可以使用: HelpUri : http://go.microsoft.com/fwlink/?LinkID=113308 ResolvedCommandName : Get-ChildItem ReferencedCommand : Get-ChildItem ResolvedCommand : Get-ChildItem Definition : Get-ChildItem查看全部
-
除了自动化变量 $DebugPreference能配置调试信息输出的方式和行为,还有一些自动化变量可以实现类似的目的。 这里稍作回顾和总结。 ConfirmPreference:设置提问确认的级别,可以参考:http://www.mossfly.com/powershell-what-if.html DebugPreference:设置debug信息的显示级别,参考本文上面的信息。 ErrorActionPreference:设置发生错误后的执行动作,可以参考:http://www.mossfly.com/powershell-define-fault-tolerance.html ErrorView:设置错误的显示模式,可以参考:http://www.mossfly.com/powershell-define-fault-tolerance.html ProgressPreference:设置进度条的显示模式,可以参考:http://www.mossfly.com/powershell-cmdlet-write-progress.html ReportErrorShowExceptionClass:显示异常所在的类。 ReportErrorShowInnerException:显示异常内部异常信息。 ReportErrorShowSource:显示异常的来源。 ReportErrorShowStackTrace:显示异常的错误跟踪栈。 VerbosePreference:设置详细信息的显示模式。 WarningPreference:设置警告信息的显示模式。 单步跟踪:逐行执行 我们可以在 Powershell ISE 中通过F9断点执行Powershell脚本。但是即使没有ISE也可以单步跟踪。 只需要Set-PSDebug -step,Powershell会每只行一段代码,就会向用户询问是否继续执行。 详细信息可以查看:http://www.mossfly.com/powershell-cmdlet-set-psdebug.html查看全部
-
在脚本和函数中使用断点停止脚本执行,方便调试Powershell脚本的异常和错误。如果逻辑不是很复杂,直接输出一些帮助信息,也可以实现调试的目的。最简单的使用调试输出命令,如果你在控制台输入: Write-Debug “输出一行调试信息,看看发生了神马?” 你可能会很奇怪,命令没有输出任何信息,感觉好像没做什么。事实上,Write-debug 的行为受$DebugPreference的影响,$DebugPreference值默认为”SilentlyContinue”,此时Write-debug不会输出任何信息。 $DebugPreference可选的配置如下: SilentlyContinue:调试关闭 Stop:输出调试信息,终止脚本执行 Continue:输出调试信息,继续执行脚本 Inquire:输出调试信息,询问用户是否继续执行。 可以通过下面的例子对比: PS C:> $DebugPreference="silentlycontinue" PS C:> Write-Debug "输入一行调试信息" ; Write-Host "伦敦奥运会女子体操决赛" 伦敦奥运会女子体操决赛 PS C:> $DebugPreference="stop" PS C:> Write-Debug "输入一行调试信息" ; Write-Host "伦敦奥运会女子体操决赛" 调试: 输入一行调试信息 Write-Debug : 已停止执行命令,因为首选项变量“DebugPreference”或通用参数被设置为 Stop。 所在位置 行:1 字符: 12 + Write-Debug <<<< "输入一行调试信息" ; Write-Host "伦敦奥运会女子体操决赛" + CategoryInfo : OperationStopped: (:) [Write-Debug], ParentContainsErrorRecordExceptio + FullyQualifiedErrorId : ActionPreferenceStop,Microsoft.PowerShell.Commands.WriteDebugCommand PS C:> $DebugPreference="continue"查看全部
-
在Powershell中还可以嵌套函数,也就是函数中定义函数。Trap 定义在外部函数,内部函数的异常,会在外部被捕获。此时的内部函数就像一连串的脚本块。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function test-func { # 将 Trap 定义在函数外面: Trap {"Trap Error: $($_.Exception.Message)"; Continue} # 内部函数 function InnerCore { 1/$null Get-Process "nosuchthing" -ea Stop Dir xyz: -ea Stop } InnerCore } test-func #Trap Error: 试图除以零。 其实也没有必要定义内部函数,因为脚本块也可以做到这一点。可以通过&符号定义脚本块。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function test-func { # 将 Trap 定义在函数外面: Trap {"Trap Error: $($_.Exception.Message)"; Continue} # 内部函数 &{ 1/$null Get-Process "nosuchthing" -ea Stop Dir xyz: -ea Stop } } test-func #Trap Error: 试图除以零。查看全部
-
如果将Trap放在函数的调用者中,并跟上Continue,这样函数中第一条错误发生,脚本就会终止执行,并且屏蔽Powershell默认的错误输出。第一次遇到错误就终止执行的原因是:内嵌函数被当做一条执行语句来看待,所以只要有错误就不再执行了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function Caller { Trap { "Trap Error: $($_.Exception.Message)"; Continue } Test-Func } function Test-Func { 1/$null Get-Process "nosuchthing" -ea Stop Dir xyz: -ea Stop } Caller #Trap Error: 试图除以零。查看全部
-
如果你想让脚本在第一次遇到异常就停止工作,可以在Trap中添加Break,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Function Test-Func { Trap { "Trap到了异常: $($_.Exception.Message)"; Break } 1/$null Get-Process "NoSuchProcess" -ErrorAction Stop Dir MossFly: -ErrorAction Stop } Test-Func Trap到了异常: 试图除以零。 试图除以零。 所在位置 E:MyScript.ps1:8 字符: 3 + 1/ <<<< $null + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordExc eption + FullyQualifiedErrorId : RuntimeException查看全部
-
因为如果ErrorAction没有设置为Stop,ErrorAction不会向被调用者报告每个异常。一旦将ErrorAction设置为Stop,则会每次报告异常,每次都会被Trap到。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Function Test-Func { Trap { "Trap 到异常了." } 1/$null Get-Process "NoSuchProcess" -ErrorAction Stop Dir MossFly: -ErrorAction Stop } Test-Func Trap 到异常了. 试图除以零。 所在位置 E:MyScript.ps1:5 字符: 3 + 1/ <<<< $null + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException Trap 到异常了. Get-Process : 找不到名为“NoSuchProcess”的进程。请验证该进程名称,然后再次调用 cmdlet。 所在位置 E:MyScript.ps1:6 字符: 12 + Get-Process <<查看全部
-
决定异常产生后脚本是继续执行还是停止执行与ErrorAction和Traps有关。因为Traps运行在ErrorAction之后,即使ErrorAction的参数为Stop,也有可能被Trap的设置覆盖。 因为系统中$ErrorActionPreference的默认值为Continue,下面函数中的脚本遇到错误时,会继续执行。但是Trap只会执行一次。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Function Test-Func { Trap { "Trap 到异常了." } 1/$null Get-Process "NoSuchProcess" Dir MossFly: } Test-Func E:MyScript.ps1 Trap 到异常了. 试图除以零。 所在位置 E:MyScript.ps1:4 字符: 3 + 1/ <<<< $null + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException查看全部
-
抛出自定义异常信息 如果你想抛出自己的异常信息,可以通过Throw关键字,下面的例子验证第二个参数的传入的值,如果传入的值为NULL,抛出异常。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Function Func-Test($a,$b) { if($b -eq $null) { throw "参数b 不能为空!" } "{0}+{1}={2}" -f $a,$b,($a+$b) } Func-Test -a 10 参数b 不能为空! 所在位置 E:MyScript.ps1:6 字符: 10 + throw <<<< "参数b 不能为空!" + CategoryInfo : OperationStopped: (参数b 不能为空!:String) [], RuntimeException + FullyQualifiedErrorId : 参数b 不能为空! 上面的函数的参数检查可以参数定义中效果会更好,即给参数设定默认值,默认的值就是抛出一个异常,如果没有传入的参数,会以默认值为准,也就是抛出异常。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Function Func-Test($a,$b=$(throw "参数B 不能为空!")) { "{0}+{1}={2}" -f $a,$b,($a+$b) } Func-Test -a 10 -b 9 Func-Test -a 10 #输出结果 10+9=19 参数B 不能为空! 所在位置 E:MyScript.ps1:2 字符: 33 + Function Func-Test($a,$b=$(throw <<<< "参数B 不能为空!")) + CategoryInfo : OperationStopped: (参数B 不能为空!:String) [], RuntimeEx ception + FullyQualifiedErrorId : 参数B 不能为空!查看全部
-
处理特定的异常 在使用Trap处理异常时,可以像.NET中的Try一样捕获特定的异常,并且做特定的处理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Trap [System.DivideByZeroException] { "除数为空!"; Continue } Trap [System.Management.Automation.ParameterBindingException] { "参数不正确!"; Continue } Trap [System.Net.WebException]{ "网络异常!" Continue } 1/$null Dir -MacGuffin $wc = new-object System.Net.WebClient $wc.DownloadFile("http://www.mossfly.com/powershell.txt","e:ps.txt") #除数为空! #参数不正确! #网络异常!查看全部
-
“Exception”并不是每天都会遇到。但是在当今的IT世界里,”Errors”和”Bugs”往往是可以避免的。当一个error发生时,程序会通过抛出一个异常来弥补。作为上层的调用者,最好能对捕获和处理潜在的异常,否则在Powershell控制台上会红色高亮显示出错。 但是在Powershell中$Error中元素的类型为:错误记录。每个Error元素的中包含属性Exception,这个Exception和.NET中的Exception对应。 1 2 3 4 5 6 7 8 9 10 11 #查看最后的异常 $Error[0].Exception.Message #找不到路径“Cddd”,因为该路径不存在。 #列出当前Error变量中存储的Exception类型 #当$Error中Exception为null时,不能调用Message,否则会报错。 $Error | where {$_.Exception -ne $null} | foreach {$_.Exception.GetType().fullName } System.Management.Automation.RuntimeException System.Management.Automation.RuntimeException System.Management.Automation.ItemNotFoundException System.Management.Automation.CommandNotFoundException查看全部
-
通过Traps查看错误信息 最后Trap语句中也提供了一种存储错误的方式,自动化变量$_ ,你可以对$_进行深加工,定制你自己的异常信息。 Trap { "完蛋了, 貌似出错了: $($_.Exception.Message)"; Continue; } Remove-Item "Books" -ea Stop # 完蛋了, 貌似出错了: 找不到路径“C:UsersMosser LeeBooks”,因为该路径不存在。查看全部
-
通过$Error查看错误信息 即使你忘记使用ErrorVariable参数去收集异常,Powershell也会自动收集异常,存储在自动化变量$Error中。$Error同样也是数组,每次会把最后发生的异常保存在索引为0的位置,所以查看最后的一个异常可以使用$Error[0]。有没有一种可能,这个数组拼命地存储异常,也会占用内存资源啊。所以可以使用$Error.Clear(),清空异常。即使你不清理异常,这个数组也有最大值的,最大值存储在$MaximumErrorCount自动化变量中,默认为256. $MaximumErrorCount # 256 $MaximumErrorCount=267 $MaximumErrorCount # 267查看全部
-
重定向有时也没必要,因为绝大多数Cmdltes都支持-ErrorVariable 参数。只要你将变量名称传递给-ErrorVariable,Powershell就会自动把出现的错误保存到这个变量中,并且这种保存机制不受ErrorAction配置的影响。 Remove-Item "NoSuchDirectory" -ErrorVariable ErrorStore -ErrorAction "SilentlyContinue" $ErrorStore Remove-Item : 找不到路径“E:NoSuchDirectory”,因为该路径不存在。 所在位置 行:1 字符: 12 + Remove-Item <<<< "NoSuchDirectory" -ErrorVariable ErrorStore -ErrorAction "SilentlyContinue" + CategoryInfo : ObjectNotFound: (E:NoSuchDirectory:String) [Remove-Item], It查看全部
举报
0/150
提交
取消