Как получить доступ к свойству Error после использования командлета без цикла - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь получить некоторую информацию о Remove-Item операции в PowerShell.

Поскольку я не хочу останавливать цикл при сбое одного элемента из 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 ]

1 голос
/ 03 мая 2019

Мне нравится удовольствие @ 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}
    }
}
0 голосов
/ 02 мая 2019

Использовать -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}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...