Короткий ответ - да. Но это зависит, какой формат дб Вы имеете. Если у Вас есть простой текстовый файл с SQL-операторами, можно использовать инструменты Unix как awk, grep, разность, и т.д. Или можно использовать жемчуг, он должен упростить проблему. Зависит Вашего типа БД, типа резервирования и размера.
Более простой и менее запутанный способ перехватывать специфичные для командлета ошибки в файл - использовать -Errorvariable параметр. Он встроен в большинство командлетов. Ненадежно смотреть на переменную $ Error, поскольку это глобальная переменная, и у нее высока вероятность появления других явных ошибок в процессе PowerShell.
Приведенный ниже код регистрирует ошибки в 2 файлах журнала.
gacl_errors.csv - содержит ошибки при перечислении ACL для определенного файла / папки.
Get-ChildItem C: \ Temp -Recurse -ErrorAction SilentlyContinue -ErrorVariable gci_errors | ForEach-Object {
$ _ | Get-Acl -ErrorAction SilentlyContinue -ErrorVariable gacl_errors
}
$ gci_errors | Select-Object -ExpandProperty CategoryInfo | Экспорт-CSV -NoTypeInformation -Path C: \ Temp \ gci_errors.csv
$ gacl_errors | Select-Object -ExpandProperty CategoryInfo | Экспорт-CSV -NoTypeInformation -Path C: \ Temp \ gacl_errors.csv
Я изменил вывод в файл CSV в соответствии с вашими требованиями. Это имеет больше смысла, поскольку его легче анализировать и импортировать для выполнения команд с данными. CSV имеет заголовок столбца под названием Target , который отражает путь к папке, вызывающей проблемы. Вы можете написать командлет, например Fix-DirPerms , и передать его по конвейеру. Что-то вроде:
Import-CSV -Path c:\Temp\gci_errors.csv | Fix-DirPerms
Есть много разных способов сделать это. Вот кое-что, что я только что придумал.
$Error.Clear() # This is a global variable!
$Errors = @()
$Items = Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue
ForEach($Err In $Error)
{
$Errors += $Err.Exception
}
ForEach($Item In $Items)
{
Try
{
$Item | Get-ACL -ErrorAction SilentlyContinue | Out-Null
}
Catch
{
$Errors += "$($_.Exception.Message) $($Item.FullName)"
}
}
Write-Host $Errors.Count "errors encountered."
$Errors | Out-File errors.txt
Итак, теперь у вас есть аккуратный список всех ошибок, которые были обнаружены либо в процессе Get-ChildItem, либо в процессе Get-ACL, что важно, поскольку во время каждая операция. Вы можете передать переменную $ Errors в CSV или что угодно. Это, вероятно, займет много времени на сетевом ресурсе 3 ТБ. Попробуйте добавить индикатор выполнения.