How to pipe the output of a command to a file without powershell changing the encoding?

不打扰是莪最后的温柔 提交于 2019-12-01 22:39:30

Try using set-content:

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

If you need additional info on set-content just run

get-help set-content

You can also use 'sc' as a shortcut for set-content.

Tested with the following, produces a readable 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

If you are calling out to a non-PowerShell executable like ipconfig and you just want to capture the bytes from Standard Output, try Start-Process:

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

Create a batchfile containing the line

create-png > binary.png

and call that from Powershell via

& cmd /c batchfile.bat

If you'd rather pass the command to cmd as command line parameter:

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

According to this well written blog article

When using curl with PowerShell, never, never redirect to file with >. Always use the –o or –out switch. If you need to stream the output of curl to another utility (say gpg) then you need to sub-shell into cmd for the binary streaming or use temporary files.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!