Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当powershell中出现错误时,如何获取错误代码?_Powershell - Fatal编程技术网

当powershell中出现错误时,如何获取错误代码?

当powershell中出现错误时,如何获取错误代码?,powershell,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:\users\bkp不存在。即使$msg给我错误消息,$LAS

我的代码片段如下所示:

$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。如何捕获为标志?

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

如果由于文件未找到错误导致删除项失败,它会将
System.Management.Automation.ItemNotFoundException
写入错误流。使用try/catch,您可以从删除项中筛选该特定错误或其他特定错误。如果您只是在命令行中键入PS命令,则可以输入
$error[0]|选择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
}

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

听起来你只是想知道这个命令是否有效?然而,这并不总是一个“是/否”的决定。例如,您可以告诉remove item删除10个文件,但它最终会删除8个文件,因为其他程序正在使用这两个文件。你认为成功还是失败?我认为您可能希望使用try/catch(请参阅关于_try的帮助),如果出现任何错误,那么您希望捕获错误并从那里开始。我将编辑答案以给出一些示例代码
try..catch
不起作用,因为错误是非终止性的。您必须将
-ErrorAction Stop
添加到
删除项
,才能捕获错误。这不是事实<代码>尝试{alskjfdlj}捕捉{'hi'}显示'hi'。未找到异常的命令未终止-
asdlkfjls;写入主机hi
将显示hi。但是
抛出“go”;write host hi
将不会显示“hi”`(表明终止异常将阻止写入主机执行)@Ansgar回过头来看,我看到了一些微妙的行为。无论$ErrorActionPreference是什么,都可以捕获由无效命令引起的CommandNotFoundException。然而,只有当EA停止时,它才会终止。另一方面,只有当EA停止时,
删除项目asdlkjlsa
才可捕获(并终止)。因此,根据具体情况,我们都是对的。我们讨论的是现有cmdlet(
Remove Item
)由于不存在对象(
C:\Users\bkp
)而引发的错误,而不是因为不存在cmdlet(
alskjfdlj
)而引发的错误。不同的事情<代码>尝试{Remove Item“C:\nonexisting“2>$null}catch{“catch”}不会显示
捕获的
,除非
-ErrorAction
$ErrorActionPreference
设置为
停止
。我没有编造这些东西。我认为最好添加
-ErrorAction SilentlyContinue
,这样,如果cmdlet由于错误而失败,它就不会终止并跳过if语句。错误信息不会被打印到控制台两次。@Jackie是的,如果OP想自己处理所有错误。但是,从他最初的问题来看,他正在将错误重定向到标准输出流,因此我认为他仍然希望看到它们。这包含了会话中遇到的每个错误,在某种程度上,因为我相信它确实对内存分配有限制。