使用不带循环的cmdlet后如何访问错误属性

时间:2019-05-02 19:52:44

标签: powershell

我正在尝试获取PowerShell中Remove-Item操作的一些信息。

由于我不希望在Remove-Item上的一项失败时循环停止,因此无法使用Try{} catch{}-ErrorAction Stop

有没有一种方法可以获取我想要的错误信息,而不必在Remove-Item之前清除错误变量,也不必使用循环来遍历文件?

$error.clear()
$Files | Remove-Item -Force
0..($error.count - 1) | % { 
    $x = $Error[$_].CategoryInfo
    $y = "{0}, {1}, {2}" -f $x.Category, $x.Reason, $x.TargetName
    $ResultLog += [PSCustomObject]@{Result="Error"; Path=$p.path; Message=$y}
}

2 个答案:

答案 0 :(得分:1)

我喜欢@ HAL9256的主动性,但是我认为使用$ Error.count是一个坏主意。计数最多增加256个项目,然后再停止计数并开始删除最早的错误。根据文件和错误的数量,您可能会很容易在那儿用完空间。

https://devblogs.microsoft.com/scripting/powershell-error-handling-and-why-you-should-care/

与使用管道相比,我认为foreach会更适合。

$ResultLog = @()
foreach ($file in $files) {
    try {
        Remove-Item $file -Force -ErrorAction Stop
    } catch {
        $x = $_.CategoryInfo
        $y = "{0}, {1}, {2}" -f $x.Category, $x.Reason, $x.TargetName
        $ResultLog += [PSCustomObject]@{Result="Error"; Path=$p.path; Message=$y}
    }
}

答案 1 :(得分:0)

使用-ErrorAction Continue不会停止脚本的运行,但仍会添加到$Error变量中。

由于$Error变量是一个数组,因此不必在运行前清除$Error变量,只需在运行前存储错误计数,然后使用For循环即可遍历新消息。

$ErrorsBefore = $Error.Count

$Files | Remove-Item -Force -ErrorAction Continue

$ResultLog = @()
For($i=0 ; $i -lt ($error.count - $ErrorsBefore); $i++) { 
    $x = $Error[$i].CategoryInfo
    $y = "{0}, {1}, {2}" -f $x.Category, $x.Reason, $x.TargetName
    $ResultLog += [PSCustomObject]@{Result="Error"; Path=$p.path; Message=$y}
}