我正在尝试获取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}
}
答案 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}
}