【问题标题】:Catching errors from external command从外部命令捕获错误
【发布时间】:2016-03-20 14:53:31
【问题描述】:

如果我运行这个函数(没有try..catch):

executezipFullBackup -PathFileLocation "Z:\" -PathSaveBackup "E:\" -NameOfBackup "MyNASStorage"

PoweShell 给我这个错误:

sz :
在 C:\PowerShellF\zipFunction.ps1:6 char:9
+ sz a -t7z "$PathSaveBackup\$NameOfBackup" "$PathFileLocation" #backup
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

错误:
磁盘上的重复文件名:
BackupTest\private\103.tmp\usr\bin\mail
BackupTest\private\103.tmp\usr\bin\Mail

这个错误对我来说没问题,因为我知道这一步出了什么问题。

但我的问题是,如果我将此脚本放在try..catch 中,我不会收到此错误。 示例:

$ErrorActionPreference = "Stop";      #this is for Try Catch
try {
    zipFullBackup -PathFileLocation "$PathFileLocation" -PathSaveBackup "$PathSaveBackup" -NameOfBackup "$NameOfBackup"          
} catch {
    $MyError = ($Error[0] | Out-String);
    Write-Host "$MyError"
}

我收到这样的错误:

sz :
在 C:\PowerShellF\zipFunction.ps1:6 char:9
+ sz a -t7z "$PathSaveBackup\$NameOfBackup" "$PathFileLocation" #backup
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

这个错误对我来说还不够,因为我没有看到 ERROR!我没有看到这个:

错误:
磁盘上的重复文件名:
BackupTest\private\103.tmp\usr\bin\mail
BackupTest\private\103.tmp\usr\bin\Mail

如何让try..catch 显示此错误?

【问题讨论】:

  • 什么是“executezipFullBackup”?这是一个exe,一个批处理文件,还是其他的?

标签: powershell


【解决方案1】:

该错误消息不是 PowerShell 错误/异常的一部分,而是 7zip 本身打印到 STDOUT 的消息。因此它不能被try..catch 块捕获,即使你设置了$ErrorActionPreference = 'Stop'

不过,您可以将命令输出收集到一个变量中:

$msg = zipFullBackup ...

【讨论】:

  • 即使它不是 powershell 错误/异常,它也会停止程序并进入“Catch”部分。如果您排除 try catch 块,程序会崩溃并提供更多信息,而不是您无法摆脱 $Error 变量。 OP 的问题是如何获取这些信息。
  • 一个命令在抛出后如何将更多信息打印到控制台?这里有些东西似乎没有意义。
  • 没有try catch块,当程序崩溃时,它会显示一些信息。问题是如何在不使程序崩溃的情况下获取该信息....意思是捕获
  • @Ratzor 请确保您在否决答案之前真正理解答案(您可能会发现this article 教育)。以ERROR: 行开头的输出由 7-zip 可执行文件本身创建并打印到 STDOUT。可以按照我的回答中的描述进行捕获。它不会自动包含在 PowerShell 错误对象中,因此不受 try..catch 的约束。
  • @KoryGill 不同流上的输出不保证按照生成的顺序打印。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2011-08-15
相关资源
最近更新 更多