PowerShell: перенаправление ошибок mysqldump.exe - PullRequest
1 голос
/ 01 июня 2011

Вот команда, которую я использовал для резервного копирования одной из моих баз данных MySQL:

mysqldump.exe --user=myuser --password=mypassword --databases --opt MyDatabase > "C:\MyDatabase.sql"

Я бы хотел использовать эту команду в скрипте PowerShell. Однако, если происходит ошибка, я не хочу, чтобы она выводилась на консоль. Вместо этого я хотел бы, чтобы это было записано в переменной. Я пробовал разные способы сделать это, но все не удалось. Любая помощь будет оценена. Спасибо!

1 Ответ

2 голосов
/ 01 июня 2011

Во-первых, остерегайтесь >, если дамп базы данных не обязательно должен быть в 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)
...