PowerShell中的SVN输出编码

时间:2012-06-07 12:40:35

标签: svn powershell character-encoding

我正在尝试在PowerShell脚本中的字符串中捕获SVN日志。

在命令行中,输出的编码是正确的,但只要我在字符串中捕获它就不是:

PS C:\sandbox> svn log -r1804 https://myserver.here/svn/myrepo
--------------------------------------------------------------
r1804 | myname | 2012-06-07 | 1 line
Here is my log message with a special caractère
--------------------------------------------------------------
PS C:\sandbox> $tempStr = svn log -r1804 https://myserver.here/svn/myrepo | Out-String
PS C:\sandbox> $tempStr
--------------------------------------------------------------
r1804 | myname | 2012-06-07 | 1 line
Here is my log message with a special caractére
--------------------------------------------------------------

如果它可以提供帮助,这是我的系统上$ OutputEncoding的值:

IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127

谢谢!

修改

我也尝试过SVN的XML输出,但没有运气!

$CmdLine = "svn log -r40:HEAD https://myserver.here/svn/myrepo --xml";

$Logs = [xml](Invoke-Expression $CmdLine);

foreach ($Commit in $Logs.log.logentry)
{
   Write-Host $Commit.msg;
}

编辑#2:

我不知道它是否有帮助,但我注意到同样的问题就是直接在PowerShell控制台提示符下使用XML输出格式:

PS C:\repo> svn log -r999:999
------------------------------------------------------------------------
r999 | myname | 2013-05-29 09:48:20 +0200 (mer., 29 mai 2013) | 2 lines

Log message line #1 with a special 'caractère'
Log message line #2
------------------------------------------------------------------------

PS C:\repo> svn log -r999:999 --xml
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
   revision="999">
<author>myname</author>
<date>2013-05-29T07:48:20.915930Z</date>
<msg>Log message line #1 with a special 'caractére'
Log message line #2</msg>
</logentry>
</log>

4 个答案:

答案 0 :(得分:2)

试着说出来:

$OutputEncoding = [Console]::OutputEncoding
在你的svn电话会议之前

答案 1 :(得分:1)

它不是直接对PowerShell友好,但是SharpSvn直接为.Net提供了Subversion api,因此您根本不需要任何解析。

如果您使用'svn log',我建议使用--xml以避免必须应对将来的输出更改。

svn的输出是UTF-8,它以Unicode的形式传输到Windows,所以我建议读作Unicode。

答案 2 :(得分:1)

此博文Powershell, SVN Log, and Encodings解释并解决了Powershell中与SVN编码非常类似的问题。它对我有用。

答案 3 :(得分:1)

我很幸运:

$enc = [System.Text.Encoding]::GetEncoding($Host.CurrentCulture.TextInfo.OEMCodePage)
$output = $enc.GetBytes((svn log --xml))
[xml] $result = [System.Text.Encoding]::UTF8.GetString($output)