从PowerShell中的第三方应用程序输出更改编码

时间:2018-10-19 09:50:16

标签: postgresql powershell

上下文:我正在使用pg_dump.exe自动执行PostgreSQL数据库的备份。我开始编写要在命令行中执行的批处理文件,但是我正在努力格式化当前日期和时间,以便将其传递给备份文件的名称。因此,我决定使用PowerShell。

问题:当我从命令行执行pg_dump时,输出正确打印:我的语言环境是法语,您可以在下面的屏幕截图中看到输出格式正确,尤其是带有重音符号的字符,例如é,è等正确打印。

enter image description here

但是在PowerShell中执行相同操作时,重音字符会被弄乱:

enter image description here

我已经将PowerShell输出编码切换为UTF-8(请参见下面的代码),但不能解决问题。

我的代码:

#--------------------------------#
# script pour réaliser des sauvegardes automatiques de la base SQL
# Robin Bourgeon octobre 2018
#--------------------------------#
$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

$app = 'C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe'
$args = @('--file=C:\Users\rbourgeon\Desktop\test_backup_psql\backup_test.backup','--format=c','--no-owner','--verbose','--no-privileges','--dbname=base_test_sauvegarde','--host=localhost','--port=5432',
'--username=postgres','--no-password','--role=postgres','--clean','--if-exists')
& $app $args 2>&1 | %{ "$_" }

1 个答案:

答案 0 :(得分:2)

资源

根据第一个线程,控制台输出的行为有点奇怪,但这是如何更改其编码的方法:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("ISO-8859-1")

话虽如此,它不一定能在传统的PowerShell控制台中按预期工作,如下所示。

然后我建议将输出管道到文件并在那一点上管理编码。

[System.IO.File]::WriteAllText("\\path\to\file", $_, [System.Text.Encoding]::GetEncoding("ISO-8859-1"))

这显然不是最佳选择...

MWE

$Latin1 = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
[Console]::OutputEncoding = $Latin1

$Output = @"
Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.
"@

Write-Host $Output

[System.IO.File]::WriteAllText("test.txt", $Output, $Latin1)

输出

PowerShell v5

  

LesReprésentantsdu PeupleFrançais,组成人民集会   Nationale,康斯丹·朗·欧诺朗斯,l'oubli ou lemépris des   昂首尔之声起因   Gouvernements的腐败,勒苏拉·德·普罗斯公墓,丹麦   Déclarationsolennelle,自然法则,inaliénables etsacrés   de l'Homme,Afin que CetteDéclaration,便秘présenteÃtous   les Membres du corps social,leur rappelle sans cesse leurs droits et   leurs devoirs;阿普尔·勒·莱斯·德·普瓦瓦尔·勒·吉斯拉蒂夫等   pouvoirexécutif,pouvantÃtre和que即时比较器avec le   但是,政治上的政治举动,使人们更加尊重。阿芬   法兰西河畔雷克劳梅茨河畔德芳斯河畔德河畔   基本原理和无条件输出结果,巡回演唱会   《宪法》和《宪法》。

PowerShell Core v6

  

法兰西共和国人民代表大会(LesReprésentantsdu PeupleFrançais)   国家,体面的无知,欧布利   昂首尔之声起因   政府的腐败腐败,丹麦丹索勒   申根宣言,自然法,不法行为和神圣   l'Homme(阿芬克雷特宣言),Pésenteàtous les游说   成员社会组织,Leur Ra​​ppelle Sans Cesse Leurs droits等   leurs devoirs;普法尔河畔阿菲·勒·勒·阿盖斯·阿特克斯   pouvoirexécutif,pouvantêtreàchaque即刻比较   政治上的政治家,在社会上加尊重;阿芬奎   原则上的公民报   简单与无可争辩的旅游者   《宪法》和《宪法》。

输出文件

  

法兰西共和国人民代表大会(LesReprésentantsdu PeupleFrançais)   国家,体面的无知,欧布利   昂首尔之声起因   政府的腐败腐败,丹麦丹索勒   申根宣言,自然法,不法行为和神圣   l'Homme(阿芬克雷特宣言),Pésenteàtous les游说   成员社会组织,Leur Ra​​ppelle Sans Cesse Leurs droits等   leurs devoirs;普法尔河畔阿菲·勒·勒·阿盖斯·阿特克斯   pouvoirexécutif,pouvantêtreàchaque即刻比较   政治上的政治家,在社会上加尊重;阿芬奎   原则上的公民报   简单与无可争辩的旅游者   《宪法》和《宪法》。