我想将命令的输出传递给文件:
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更改编码?
相关问题
答案 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进行二进制流或使用临时文件。