2013-07-04 100 views
7

我的片段是这样的:如何在PowerShell中出现错误时获取错误代码?

$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:\用户\ BKP不存在。即使$味精给我的错误消息$ LASTEXITCODE仍然是0.我如何捕获作为标志?

+0

您可以只检查$ error变量。这包含了会话中遇到的每一个错误,并且我认为它确实对内存分配有限制。 –

回答

9

$ 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或trap),抛出的错误将导致脚本终止。抛出的错误通常是.NET类system.Management.Automation.ErrorRecord的子类。 ErrorRecord提供了比错误代码更多的关于错误的信息。

如果remove-item因文件未找到错误而失败,它会向错误流写入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 
} 
+0

它没有设置任何错误标志? –

+0

听起来像你只是想知道命令是否工作?然而,这并不总是只是一个是/否的决定。例如,您可以告诉remove-item删除10个文件,但最终删除8个文件,因为其他程序正在使用两个文件。你认为成功还是失败?我想你可能想使用try/catch(请参阅about_try帮助),如果发生任何错误,那么您希望捕获错误并从那里开始。我将编辑答案给一些示例代码 –

+2

'try..catch'不起作用,因为错误不是终止的。您必须将'-ErrorAction Stop'添加到'Remove-Item'以使错误可捕获。 –

12

可以使用$?automatic variable,以确定最后的命令的结果。如果您需要访问实际的错误,则可以使用$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 
} 
+0

伟大..让我试着回去.. –

+1

我认为最好添加'-ErrorAction SilentlyContinue',这样如果cmdlet失败,因为它不会终止并跳过如果声明。并且错误消息将不会打印到控制台两次。 – Jackie

+0

@Jackie是的,如果OP想自己处理所有的错误。但是,从他最初的问题来看,他将错误重定向到标准输出流,所以我认为他仍然希望看到它们。 –