2011-06-01 12 views
1

這是我一直在使用備份我的MySQL數據庫的一個命令:的PowerShell:重定向mysqldump.exe的錯誤

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

我想在PowerShell腳本中使用此命令。但是,如果發生錯誤,我不希望它被輸出到控制檯。相反,我希望它在一個變量中捕獲。我一直在嘗試各種方法,但都失敗了。任何援助將不勝感激。謝謝!

回答

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,以便它可以被分配到變量le $ err。

$err是1 ErrorRecord或更多。一個錯誤的TargetObject屬性包含原始stderr輸出。這裏的每一個錯誤字符串打印到控制檯的演示:

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

或者,你可以確保$err是由它環繞的@()好主意,邁克)略微修改原始轉儲聲明數組:

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

難道你不能使用@()而不是$()使$ err成爲一個數組嗎?這將消除if/else的需要。 – 2011-06-01 18:51:35

+0

非常感謝!我用'$(&「$ MySQLDumpPath」...'取代了'$(mysqldump ...)',並且做了訣竅。 – Frank 2011-06-01 18:56:19

+0

@Frank:好的,我可以像我一樣調用我的,因爲MySQL的'bin'路徑是我的'PATH'環境變量的一部分,你也可以把你的整個調用放在一個像$ mdump =「$ MySQLDumpPath --arg1 --arg2」'這樣的字符串變量中,並用'iex $ mdump'執行。 – 2011-06-01 19:22:25