PowerShell:重定向mysqldump.exe的错误

时间:2011-06-01 18:06:05

标签: powershell error-handling mysqldump

这是我用来备份我的一个MySQL数据库的命令:

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

我想在PowerShell脚本中使用此命令。但是,如果发生错误,我不希望将其输出到控制台。相反,我希望它在变量中捕获。我一直在尝试各种方法,但都失败了。任何援助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

首先,请注意>,如果您的数据库转储不需要是Unicode,而是ASCII。您可以使用| out-file $filepath -enc ascii来确保以ASCII编码进行写入。 (我的数据库位于latin1。如果我使用Powershell的>,则转储文件的大小是从普通控制台使用>转储时的两倍。)

那就是说,我把它转换成ASCII格式的文件并以这种方式将错误放在变量中(通过尝试转储不存在的数据库来强制错误,但mysqldump输出转储的许多初始化行在它抛出错误之前):

$err = (mysqldump -uroot -p --databases nonexistent | out-file C:\backup.sql -enc ascii) 2>&1

这包装执行以便stdout通过管道传递给out-file,但在包装之后,stderr被重定向到stdout,以便可以将它分配给变量$ err。

$err为1 ErrorRecord或更多。单个错误的TargetObject属性包含原始stderr输出。这是一个将每个错误字符串打印到控制台的演示:

if ($err -is [system.array]) {
    $err | % { write-host $_.TargetObject }
} else {
    write-host $err.TargetObject
}

或者,您可以通过稍微修改原始转储语句$err好主意,Mike )来确保@()是一个数组:

$err = @((mysqldump -uroot -p --databases nonexistent | out-file C:\backup.sql -enc ascii) 2>&1)