2015-01-14 77 views
2

当我执行的是在命令行中我看到很好的格式化输出要求NPM一个批处理文件,如:楠exec命令错乱输出

├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] ([email protected]) 
├── [email protected] 
├── [email protected] 
├── [email protected] ([email protected], [email protected], support 
├── [email protected] ([email protected], [email protected], end-of- 
├── [email protected] ([email protected], [email protected], [email protected], 
├── [email protected] ([email protected], [email protected], [email protected], defa 
└── [email protected] ([email protected], [email protected], array-uni 
[email protected], [email protected], [email protected], [email protected]) 

然而,当我从南特脚本调用同一个批处理文件,使用exec任务,输出变为乱码(即使我使用了“输出”开关管输出到文件):

[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] ([email protected]) 
[exec] Ôö£ÔöÇÔöÇ [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected]) 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] 
[exec] Ôö£ÔöÇÔöÇ [email protected] ([email protected], [email protected], [email protected]) 
[exec] Ôö£ÔöÇÔöÇ [email protected] ([email protected], [email protected], [email protected], [email protected]) 
[exec] ÔööÔöÇÔöÇ [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], t 
[email protected]) 

有没有解决办法?

+0

如果使用'exec'任务的'output'参数将输出直接传输到文件,会发生什么? –

+0

谢谢@JamesThorpe,好点。经过测试,其行为相同。 –

回答

2

此行为是由于未在StandardOutput流阅读器上设置编码的NAnt exec任务的内部引起的。我用我自己的控制台应用程序复制了该行为。

问题的方法是在这里:https://github.com/nant/nant/blob/master/src/NAnt.Core/Tasks/ExternalProgramBase.cs#L511

现在缺少的是设置编码的ProcessStartInfo的方式,如:

StandardErrorEncoding = Encoding.UTF8 

唯一的解决方法,我可以看到(简称提交的将请求提交给Nant)是编写一个自定义任务。它是如此简单:

[TaskName("customexec")] 
public class CustomExecTask : ExecTask 
{ 
    protected override void PrepareProcess(Process process) 
    { 
     base.PrepareProcess(process); 
     process.StartInfo.StandardOutputEncoding = Encoding.UTF8; 
     process.StartInfo.StandardErrorEncoding = Encoding.UTF8; 
    } 
} 

我挣扎但加载我的自定义任务比使用loadtasks任务任何其他方式。

+2

不错的发现。如果没有打开一个新的bug,可能是值得一看的。开发人员对最近发布的[另一个问题](https://github.com/nant/nant/issues/84)做出了回应并创建了一个修复程序。 –