-
重定向错误记录 如果你想把一个命令的执行结果重定向,可以使用重定向操作符”>” dir "NoSuchDirectory" > Error.txt Get-Content Error.txt 不幸的是,Error 信息并没有保存到Error.txt 因为Error信息不在标准输出流上,而在Error流上,需要使用”2>”操作符。 Get-Item "NoSuchDirectory" 2> Error.txt Get-Content .error.txt Get-Item : 找不到路径“E:NoSuchDirectory”,因为该路径不存在。 所在位置 行:1 字符: 9 + Get-Item <<<< "NoSuchDirectory" 2> Error.txt + CategoryInfo : ObjectNotFound: (E:NoSuchDirectory:String) [Get-Item], ItemNotFound Exception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand #将异常重定向到$myerror $myerror = RemoveItem "NoSuchDirectory" 2>&1查看全部
-
你可以通过Powershell中的自动化变量$Error和Trap 语句块中的$_的内置变量来输出异常的详细信息。在这篇文章来深入了解Error中的记录。在Powershell控制台中一旦错误发生,异常信息会被以红色显示。红色的的设置保存在: $host.PrivateData.ErrorForegroundColor # Red $host.PrivateData.ErrorBackgroundColor # Black Powershell控制台输出的错误信息为文本,只包含了部分的错误信息。如果想访问Error的对象信息,可以通过以下的途径: Redirection:将错误流重定向到一个变量; ErrorVariable parameter : 将异常保存到一个变量中; $Error:也会以数组的形式保存出现的所有异常。查看全部
-
查看异常的详细信息 Trap 到异常后,Powershell会自动将该异常保存在$_变量中。 Trap { Write-Host $_.Exception.Message; Continue }; Stop-Process -Name "NoSuchProcess" Stop-Process : 找不到名为“NoSuchProcess”的进程。请验证该进程名称,然后再次调用 cmdlet。 所在位置 行:6 字符: 13 + Stop-Process <<<< -Name "NoSuchProcess" + CategoryInfo : ObjectNotFound: (NoSuchProcess:String) [Stop-Process], ProcessComman dException + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.StopProcess Command查看全部
-
Trap { "自动化工作发生异常,正在发邮件联系管理员给管理员!";continue;} remove-item asdfas -ErrorAction Stop write-host "hello"查看全部
-
使用Break和Continue来对异常作后续处理 Traps异常发生时使用break中断脚本执行 Trap { "异常发生,我想终止脚本!" } stop-service -name "NoSuchService" -ErrorAction "Stop" 异常发生,我想终止脚本! Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。 所在位置 行:3 字符: 13 + stop-service <<<< -name "NoSuchService" -ErrorAction "Stop" + CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Ser vice], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. Commands.StopServiceCommand Traps异常发生时,使用Continue 继续执行 Trap { "异常发生,我要继续执行!" } stop-service -name "NoSuchService" -ErrorAction "Stop" Write-Host "继续执行" 异常发生,我要继续执行! Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。 所在位置 行:3 字符: 13 + stop-service <<<< -name "NoSuchService" -ErrorAction "Stop" + CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Service], ServiceCommandException + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. Commands.StopServiceCommand 继续执行查看全部
-
使用Traps 使用Traps可以捕获异常,在捕获到异常时,可以在做相应的处理。例如我们在Powershell自动化工作中,出现了异常可以发一封邮件给管理员。 Trap { "自动化工作发生异常,正在发邮件联系管理员给管理员!"} 1/$null 自动化工作发生异常,正在发邮件联系管理员给管理员! 试图除以零。 所在位置 行:4 字符: 3 + 1/ <<<< $null + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException 到目前为止,并没有对异常进行处理。 Traps未处理的异常 上面的异常发生在运行时,但是有的异常发生在编译时,例如: Trap {"我想捕获异常"} 1/0 试图除以零。 所在位置 行:2 字符: 44 + Trap { "A dreadful error has occurred!"} 1/ <<<< 0 + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordExc eption + FullyQualifiedErrorId : RuntimeException 这次Trap没有生效,因为0为常量,该异常会在编译时被抛出,并且Traps对此无能为力。但是对于cmdlets中内部异常却可以捕获。 PS> Trap {"我想捕获异常"} PS> 1/0 我想捕获异常 尝试除以零。 所在位置 行:1 字符: 17 + Trap {"我想捕获异常"};1/0 + ~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException查看全部
-
如果你喜欢像正常的输出一样,将异常的message输出。 Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" If (!$?) { "发生异常,异常信息为$($error[0])"; break } "删除文件成功!" # 发生异常,异常信息为:找不到路径“E:文件不存在”,因为该路径不存在。查看全部
-
如果你想对错误处理,并且输出友好的信息。须要两点: 第一,抑制内置的错误信息; 第二,一个能够发现异常是否发生的机制。 在之前的文章中我们已经知道怎样抑制内置的错误消息了,是通过ErrorAction。你如果将ErrorAction设置为“SilentlyContinue”,错误信息就不会输出了。 Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" $?中的错误状态 $?变量会保存上一步操作是否成功或者失败,也就是告诉你是否发生了错误。可以写一段脚本进行测试。 Remove-Item "文件不存在" -ErrorAction "SilentlyContinue" If (!$?) { "删除文件操作失败"; break }; "删除文件成功!" #删除文件操作失败 因为文件不存在,所在Remove-Item失败,失败异常标志$?会变为$false。语句块 !$? 的值会变为$true,进而提示删除文件失败。查看全部
-
布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来。 布尔值可以用and、or和not运算。 and运算是与运算,只有所有都为 True,and运算结果才是 True。 or运算是或运算,只要其中有一个为 True,or 运算结果就是 True。 not运算是非运算,它是一个单目运算符,把 True 变成 False,False 变成 True。查看全部
-
每次执行命令都去设定ErrorAction那也忒麻烦了。有没有全局的设置呢,那就是$ErrorActionPreference,甚至还可以针对某段函数,某个脚本设置$ErrorActionPreference。 Member name Description Continue 将错误抛出来,但是脚本会继续往下执行。 Ignore 直接忽略错误,貌似在Powershell 2.0中已经没有了 Inquire 提供选项由用户选择Error Action。 SilentlyContinue 错误不抛出,脚本也会继续执行。 Stop 错误发生时,终止脚本执行查看全部
-
Powershell在执行某条命令是也可以指定对错误的处理模式。那就是ErrorAction。 Remove-Item "No this file" -ErrorAction "Continue" ; Write-Host "工作已经完成。" Remove-Item : 找不到路径“E:No this file”,因为该路径不存在。 所在位置 行:1 字符: 12 + Remove-Item <<<< "No this file" -ErrorAction "Continue" ; Write-Host "工作已经完成。" + CategoryInfo : ObjectNotFound: (E:No this file:String) [Remove-Item], ItemNotFound Exception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand 工作已经完成。 如果将ErrorAction的值设置为默认值Stop,发生错误下面的命令就会终止。 Remove-Item "No this file" -ErrorAction "Stop" ; Write-Host "工作已经完成。" Remove-Item : 找不到路径“E:No this file”,因为该路径不存在。 所在位置 行:1 字符: 12 + Remove-Item <<<< "No this file" -ErrorAction "Stop" ; Write-Host "工作已经完成。" + CategoryInfo : ObjectNotFound: (E:No this file:String) [Remove-Item], ItemNotFound Exception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand查看全部
-
Powershell拥有非常强大的容错度。只要你设定好参数,即使某一条,某一行命令执行发生错误,脚本还可以继续执行。例如你在复制一大批文件,大概需要一天时间,在你执行脚本时,你去做其它事情,结果异常发生了,如果脚本不继续执行,那当你一天以后去看结果,还可能有90%的文件没有拷贝,那么这一天的时间就白白浪费了。但是如果脚本出错了继续执行,结果可能就完成了99.99%的工作,只剩下一个文件需要重新拷贝,明显提高了效率。 Remove-Item mossfly.com ; Write-Host "工作完成" Remove-Item : 找不到路径“E:mossfly.com”,因为该路径不存在。 所在位置 行:1 字符: 4 + del <<<< mossfly.com ; Write-Host "工作完成" + CategoryInfo : ObjectNotFound: (E:mossfly.com:String) [Remove-Item], ItemNotFoundE xception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand 第二条命令没有执行,因为执行发生错误。 自动化变量$ErrorView的默认值为:NormalView,如果将$ErrorView设置为categoryview 异常就会只显示一行,看起来更加清爽,适合专业人士应用奥! $ErrorView NormalView $ErrorView="categoryview" Remove-Item www.mossfly.com ObjectNotFound: (E:www.mossfly.com:String) [Remove-Item], ItemNotFoundException查看全部
-
自动对危险的操作进行操作 因为一些操作的危险系数会比其它的操作的危险系数高,所以Powershell脚本的开发者会每一条命令进行风险评估。例如Stop-Process,它会终止当前正在运行的程序或者进程。它的危险系数被设置为中等。因为正常情况下,可能会产生的不可恢复并且不可预知的危险。例如Exchange中的命令删除用户的邮件被归类为高危险性,因为邮件一旦删除那就意味着所有的邮件内容都不复存在。 你不可能改变这些风险评估,但是你可以对此作出回应。powershell的默认设置会将自动化的操作归类为危险操作,即使你没有指定-confirm参数。这一标准的设置被存储在全局变量$ConfirmPreference中。$ConfirmPreference可以对默认设置或者其它更严格的设置作出判断与回应。但是如果你将$ConfirmPreference的值设置为“None”,Powershell就不会进行操作前询问确认,即使可能面临高风险的操作。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #查看$ConfirmPreference支持的设置 [ENUM]::GetNames($ConfirmPreference.GetType()) None Low Medium High #查看当前的$ConfirmPreference $ConfirmPreference High 确认 是否确实要执行此操作? 对目标“calc (5144)”执行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): y 总结一下,就会有两种情况。 危险环境:如果你对要执行的操作的危险性不确定,最好将$ConfirmPreference 设置为low,这样可以更安全一点。 安全环境:如果你在某些情况下要执行大量无关安全的操作,为了方便起见可以将$ConfirmPreference设置为None,因为针对每个命令都去设置-confirm 为false也是一件很繁琐的事情。但是建议最好在脚本中将$ConfirmPreference设置为”None”,这样可以将放权设置在最小的风险下。查看全部
-
逐步确认:逐个查询 正如之前看到的那样,在使用“*”通配符时,可能会在瞬间产生许多任务。为了防止产生失误操作,可以逐个进行确认,逐个进行放行。 Stop-Process -Name *cm* -Confirm 确认 是否确实要执行此操作? 对目标“cmd (1012)”执行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): ? Y - 仅继续执行操作的下一步骤。 A - 继续执行操作的所有步骤。 N - 跳过此操作并继续执行下一操作。 L - 跳过此操作及所有后续操作。 S - 暂停当前管道并返回到命令提示符。键入“exit”可继续执行该管道。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): N 确认 是否确实要执行此操作? 对目标“cmd (3704)”执行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): s PS E:>>> PS E:>>> exit 确认 是否确实要执行此操作? 对目标“cmd (3704)”执行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): y 确认 是否确实要执行此操作? 对目标“cmd (4404)”执行操作“Stop-Process”。 [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 挂起(S) [?] 帮助 (默认值为“Y”): a 确认程序提供了6个选项。 是 – 仅继续执行操作的下一步骤。 全是 – 继续执行操作的所有步骤。 否 – 跳过此操作并继续执行下一操作。 不全是 – 跳过此操作及所有后续操作。 挂起 – 暂停当前管道并返回到命令提示符。键入“exit”可继续执行该管道。 帮助 – 提供帮助信息查看全部
-
当然如果你想让自己的脚本和函数也支持模拟运行,只需要进行简单的整合。多增加一个switch参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function MapDrive([string]$driveletter, [string]$target, [switch]$whatif) { If ($whatif) { Write-Host "WhatIf: creation of a network drive " + "with the letter ${driveletter}: at destination $target" } Else { New-PSDrive $driveletter FileSystem $target } } # 首先进行模拟运行: MapDrive k 127.0.0.1c$ -whatif WhatIf: creation of a network drive with letter k: at destination 127.0.0.1c$ # 执行命令 MapDrive k 127.0.0.1c$ Name Provider Root ---- -------- ---- k FileSystem 127.0.0.1c$查看全部
举报
0/150
提交
取消