如何在没有PowerShell更改编码的情况下将命令输出传递给文件?

时间:2015-01-27 09:18:05

标签: powershell encoding pipe pipeline

我想将命令的输出传递给文件:

PS C:\Temp> create-png > binary.png

我注意到Powershell改变了编码,我可以手动给出编码:

PS C:\Temp> create-png | Out-File "binary.png" -Encoding OEM

然而,没有RAW编码选项,即使OEM选项也会将换行字节(0xA resp 0xD)更改为Windows换行字节序列(0xD 0xA),从而破坏任何二进制格式。

如何在管道传输文件时阻止Powershell更改编码?

相关问题

3 个答案:

答案 0 :(得分:4)

尝试使用set-content:

create-png | set-content -path myfile.png -encoding byte

如果您需要有关设置内容的其他信息,请运行

get-help set-content

您还可以使用'sc'作为set-content的快捷方式。

使用以下测试,生成可读的PNG:

function create-png()
{
    [System.Drawing.Bitmap] $bitmap = new-object 'System.Drawing.Bitmap'([Int32]32,[Int32]32);
    $graphics = [System.Drawing.Graphics]::FromImage($bitmap);
    $graphics.DrawString("TEST",[System.Drawing.SystemFonts]::DefaultFont,[System.Drawing.SystemBrushes]::ActiveCaption,0,0);
    $converter = new-object 'System.Drawing.ImageConverter';
    return([byte[]]($converter.ConvertTo($bitmap, [byte[]])));
}

create-png | set-content -Path 'fromsc.png' -Encoding Byte

如果您正在调用非PowerShell可执行文件(如ipconfig)并且您只想从标准输出中捕获字节,请尝试启动过程:

Start-Process -NoNewWindow -FilePath 'ipconfig' -RedirectStandardOutput 'output.dat'

答案 1 :(得分:2)

创建包含行

的批处理文件
create-png > binary.png

并通过

从Powershell调用它
& cmd /c batchfile.bat

如果您宁愿将命令传递给cmd作为命令行参数:

$x = "create-png > binary.png"
& cmd /c $x

答案 2 :(得分:1)

根据this well written blog article

  

在PowerShell中使用curl时,永远不要使用>重定向到文件。   始终使用-o或-out开关。如果你需要流式传输   将curl输出到另一个实用程序(比如gpg)然后你需要子shell   进入cmd进行二进制流或使用临时文件。