如何摆脱PowerShell的编码地狱?

时间:2016-11-08 05:20:28

标签: powershell

> cat .\foo.txt
abc

> cat .\foo.txt | md5sum
c13b6afecf97ea6b38d21a8f5167fa1e *-

> md5sum foo.txt
b79545611b3be30f90a0d21ef69bca82 *foo.txt

catmd5sum是unix端口(来自Windows Git发行版)。

这是我真实用例的玩具示例,它是二进制数据与传统python脚本的管道,我无法改变。由于管道正在进行编码,因此二进制文件已损坏。

我尝试更改$OutputEncoding[Console]::OutputEncoding并使用chcp,所有人都没有帮助(但也许我做得不对,这一切都非常复杂...... )。

PowerShell's pipe adds linefeed中的实用程序对我来说不起作用,因为它处理进程参数(我需要将一些参数传递给遗留脚本,有些需要引用,但实用程序接受所有参数为一个字符串)

最佳解决方案让我以某种方式告诉powershell完全关闭编码,只是表现为unix / cmd。

2 个答案:

答案 0 :(得分:0)

如果您使用的是Get-Content cmdlet,请按照https://technet.microsoft.com/en-us/library/hh847788.aspx中给出的建议处理二进制数据:

  

读取和写入二进制文件时,使用Byte值作为Encoding动态参数,使用值0作为ReadCount参数。

无论您是否使用Get-Content,您可能都希望避免将数据表示为StringString类型是为字符数据设计的,并不适合处理二进制数据。

答案 1 :(得分:0)

除了使用cmd来运行包括管道在内的命令外,没有办法解决它:

cmd /c cat.exe .\foo.txt "|" md5sum

请注意管道字符是引用的,因此它由cmd而不是powershell解释。