这是我用来备份我的一个MySQL数据库的命令:
mysqldump.exe --user=myuser --password=mypassword --databases --opt MyDatabase > "C:\MyDatabase.sql"
我想在PowerShell脚本中使用此命令。但是,如果发生错误,我不希望将其输出到控制台。相反,我希望它在变量中捕获。我一直在尝试各种方法,但都失败了。任何援助将不胜感激。谢谢!
答案 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)