Во-первых, остерегайтесь >
, если дамп базы данных не обязательно должен быть в Unicode, а скорее в ASCII.Вместо этого вы должны использовать | out-file $filepath -enc ascii
, чтобы убедиться, что он записывает в кодировке ASCII. (Мои базы данных находятся на латинице 1. Если я использую >
Powershell *, файл дампа будет в два раза больше, чем при выгрузке с использованием >
из обычной консоли.)
Тем не менее, я получилэто сделать дамп в файл в формате ASCII и поместить ошибки в переменную таким образом (форсируя ошибку, пытаясь создать дамп несуществующей базы данных, но mysqldump выводит несколько строк инициализации дампа, прежде чем выдает ошибку):
$err = (mysqldump -uroot -p --databases nonexistent | out-file C:\backup.sql -enc ascii) 2>&1
Это оборачивает выполнение так, что стандартный вывод передается по каналу out-file
, но после этого переноса stderr перенаправляется на стандартный вывод, так что он может быть назначен переменной $ err.
$err
- это 1 ErrorRecord
или больше.Одна ошибка имеет свойство TargetObject
, содержащее исходный вывод stderr.Вот демонстрация печати каждой строки ошибки на консоли:
if ($err -is [system.array]) {
$err | % { write-host $_.TargetObject }
} else {
write-host $err.TargetObject
}
В качестве альтернативы, вы можете убедиться, что $err
является массивом, слегка изменив исходный оператор dump, обернув его в @()
( хорошая идея, Майк ):
$err = @((mysqldump -uroot -p --databases nonexistent | out-file C:\backup.sql -enc ascii) 2>&1)