How to pipe the output of a command to a file with

2020-04-10 01:32发布

I want to pipe the output of a command to a file:

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

I noticed that Powershell changes the encoding and that I can manually give an encoding:

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

However there is no RAW encoding option, even the OEM option changes newline bytes (0xA resp 0xD) to the windows newline byte sequence (0xD 0xA) thereby ruining any binary format.

How can I prevent Powershell from changing the encoding when piping to a file?

Related questions

3条回答
看我几分像从前
2楼-- · 2020-04-10 01:46

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.

查看更多
家丑人穷心不美
3楼-- · 2020-04-10 01:52

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'
查看更多
来,给爷笑一个
4楼-- · 2020-04-10 01:59

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
查看更多
登录 后发表回答