顾名思义,PowerShell比标准Windows命令提示符强大得多。有了这种能力,错误出错的可能性就更大了。如果脚本突然失败,则您可能不知道从哪里开始寻找问题所在。在这里,PowerShell的错误处理非常方便。
如果您熟悉其他语言,您可能知道错误处理的基础知识,但是您需要了解某些特定于PowerShell的方面。 PowerShell中的错误处理包括四个部分:错误操作参数,Try / Catch块,错误变量参数和日志记录。
PowerShell错误处理简便方法
第一个处理PowerShell错误的第一步是处理使脚本停止运行的问题。如果失败不影响脚本的其余部分,则最好只是告诉PowerShell忽略错误并继续操作。
另一方面,当给定的cmdlet抛出错误时,它并不总是很清楚。终止错误。某些cmdlet返回错误,但不会停止脚本。这可能会让您等待脚本输出无意义时完成。
这是 -ErrorAction 参数的输入位置。您可以使用此命令强制cmdlet处理错误。您想要的方式。如果要修改现有脚本,请将其附加到cmdlet行的末尾。
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
很显然,如果您单独使用 Get-ChildItem cmdlet,则此错误对您没有多大帮助。但是,如果您想对数据做任何事情,最好停止脚本,这样您就知道搜索失败以及原因。另外,如果您要进行多次搜索,请将参数从 Stop (停止)更改为 SilentlyContinue (SilentlyContinue ),这样,如果搜索失败,脚本将继续执行。如果要查看错误原因,可以使用 Continue 作为参数。
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
如果您希望选择控制每次脚本运行时发生的情况,您可以将其更改为查询。当您的cmdlet遇到障碍时,它会提供以下选项:是,是所有人,停止命令,暂停,或帮助。
此选项稍微灵活一些,但这确实意味着错误会导致脚本等待输入。如果您正在使用PowerShell发送电子邮件或其他一些简单的任务,那很好,但是当您在一夜之间运行一个较长的过程时,可能并不需要这样做。
PowerShell错误处理强大的方法< /
ErrorAction 参数以一种简单的方式解决了您的错误。但是,如果您希望对错误进行更多控制,那么PowerShell仍然可以满足您的要求。现在,使用 Try / Catch ,我们可以在cmdlet返回错误时分支脚本。
顾名思义,组成 Try / Catch 两个部分。 (从技术上讲,有三分之一,但我们会在一分钟内解决。)第一个是 Try 部分。您将在本节中运行常规代码。您仍将使用 -ErrorAction 参数,但只能将其设置为停止。此标志可确保您的cmdlet触发捕获-即使它没有终止错误。
Try{ Get-Process "Cortana" -ErrorAction Stop}
如果搜索失败,Try也可以阻止其他cmdlet运行。在这种情况下,如果将 Get-Process 结果发送到 Stop-Process ,则搜索失败将阻止第二个cmdlet运行。
因此既然您已经创建了cmdlet的try块,那么当cmdlet失败时您想做什么?使用 Catch 一半,您将对此进行定义。
Catch{ Write-Host "Process Not Found"}
与 ErrorAction 参数一样,当您执行更复杂的操作时< strong> Catch 不仅可以提供简单的语言帮助,而且还可以使您受益匪浅,特别是在您做一些复杂的事情时。 (在上面的示例中,失败是通过使用应用程序名称而不是进程名称来强制执行的。)因此,请确保您使用 Try 块来创建所需的搜索/操作。您可以对脚本使用 Catch 块,以在脚本失败时通过电子邮件发送给您。
如果您想运行某些命令而无论cmdlet是否成功,则第三部分会派上用场。为此,您可以使用最后块。您可以在“尝试并捕获"之后添加此代码,并在脚本的一部分结束时记录日志。
错误变量和日志记录
您的脚本现在控制着它如何处理错误以及如何响应错误。 。您可以将其用作计划任务,或者至少在不在办公桌前运行它。但是,如何调查失败的脚本?使用 -ErrorVariable 参数,您的cmdlet的错误将写入自定义变量。
这是系统 $ Error 变量的替代方案,该变量包含所有当前会话中的错误。
您的cmdlet需要更长的时间。首先,定义一个变量,例如 $ SearchError 。当您在 ErrorVariable 参数中调用 SearchError 时,就不会使用美元符号。
即使您正在调用创建的变量,由于参数的工作方式,您可以不带美元符号来调用它。然后将其添加到该行的末尾。
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
如果在变量名称之前添加 + ,则可以添加到该变量中而不是直接替换它。这样可以使您获得与全局错误变量相同的行为。相反,您可以使用此输出并尝试/捕获来编写自定义输出,并为其加上时间戳。
要执行此操作,请在设置完后立即创建一个文本文件错误变量。使用 New-Item cmdlet执行此操作。您可能需要对 ErrorAction 参数使用 Inquire 选项。这样,当 New-Item cmdlet失败时,您可以将其添加到现有日志中。
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
现在,当您构建 Try / Catch 块时,您可以使用捕获登录到文本文件。您使用获取日期创建时间戳。格式可能很棘手,因此请务必从示例中复制该格式。
Try{ Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError}Catch{ Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"}
根据需要对所有cmdlet重复此操作,现在您可以很好地记录所有错误。如果要跟踪成功运行的事物,可以在 Try 块的末尾添加类似的 Add-Content 。
此日志记录仅运行当您的 Try cmdlet成功执行时。然后,您可以使用时间戳记录错误和成功。现在,日志记录可以让您知道脚本已完成,成功或失败的一切。
PowerShell不是您唯一的选择
尽管PowerShell是许多Windows任务的便捷工具,学习起来可能很困难。它也不适合所有情况。如果您要在计算机上进行系统维护或检查文件的完整性,那么PowerShell很方便。另一方面,如果您希望运行脚本以从Internet上下载文件或执行一些更常规的任务,则还有其他选择。
标签: