20

我的片段是这样的:

$msg=Remove-Item -Recurse -Force C:\users\bkp  2>&1
if ($LASTEXITCODE -eq 1)
{
  "Encountered error during Deleting the Folder. Error Message is $msg. Please check." >> $LogFile
  exit
 }

文件夹 C:\users\bkp 不存在。即使 $msg 给了我错误消息 $LASTEXITCODE 仍然为 0。如何捕获为标志?

4

2 回答 2

34

您可以使用$? 自动变量来确定最后一个命令的结果。如果您需要访问实际错误,可以使用$Error自动变量。数组中的第一项是最后抛出的错误:

Remove-Item -Recurse -Force C:\users\bkp 2>&1
if( -not $? )
{
    $msg = $Error[0].Exception.Message
    "Encountered error during Deleting the Folder. Error Message is $msg. Please check." >> $LogFile
    exit
}
于 2013-07-04T03:59:48.967 回答
14

$LASTEXITCODE 严格用于命令行程序返回其状态。PS 中内置的 Cmdlet,例如 Remove-item,最多以 3 种方式返回错误。对于警告,他们将消息(或其他 .NET 对象)写入“警告流”。在 PSv3 中,有一种直接的方法可以将该流重定向到一个文件:cmdlet blah blah blah 3>warning.out. 第二个是通过错误流。该流也可以被重定向... 2>error.out,或者更典型的错误是使用 try/catch 或 trap 捕获,或者使用 -ErrorVariable 参数写入变量(请参阅 参考资料help about_commonparameters)。第三种方法是“抛出”错误。除非被捕获(try/catch 或陷阱),否则抛出的错误将导致脚本终止。抛出的错误通常是 .NET 类的子类system.Management.Automation.ErrorRecord. ErrorRecord 提供了比返回码更多的错误信息。

如果 remove-item 由于文件未找到错误而失败,它会将 a 写入System.Management.Automation.ItemNotFoundException错误流。使用 try/catch,您可以从 remove-item 过滤该特定错误或其他特定错误。如果您只是从命令行输入 PS 命令,您可以输入$error[0]|select-object *以获取有关最后一个错误的大量信息。


你可以这样做:

try {
  Remove-Item -Recurse -Force C:\users\bkp  2>&1
} catch {
  # oops remove-item failed. Write warning then quit 
  # replace the following with what you want to do
  write-warning "Remove-item encounter error: $_"
  return # script failed
}
于 2013-07-04T03:53:40.703 回答