You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在PowerShell中调用Windows type命令会导致数据异常?

为什么PowerShell中用type传输/复制二进制文件会出错?

这问题我之前踩过同款坑,核心原因是PowerShell的type命令和cmd里的type根本不是一回事——前者本质是Get-Content的别名,天生是为处理文本文件设计的,对二进制文件(比如JPG)的处理逻辑会直接搞乱原始字节。

具体原因拆解:

  • PowerShell的Get-Content(type别名)默认是文本模式:
    它会把文件内容当作字符串来读取,这意味着会自动尝试识别文件编码(比如UTF-8、ASCII),但二进制文件根本没有“编码”这一说,读取时会把字节错误地解析成字符。之后输出(不管是管道传给ncat还是重定向到文件)时,又会按PowerShell的默认编码(通常是UTF-16LE)把字符串转回字节,这就导致:

    • 原ASCII范围内的字节会被补0(因为UTF-16每个字符占2字节),直接让文件体积翻倍;
    • 非ASCII的字节会被错误转换,出现零散的修改或插入内容。
      你复制文件时看到的“原字节间插入00”,就是UTF-16编码的典型表现。
  • cmd的type是字节流模式:
    cmd里的type命令不搞编码转换,就是直接按原始字节流读取和输出,处理二进制文件时和直接复制字节没区别,自然不会出错。

PowerShell中正确处理二进制文件的方法:

要绕过文本模式的坑,必须让Get-Content以字节流方式读取:

  1. PowerShell 6及以上版本:用-AsByteStream参数
    # 传输文件到Linux
    Get-Content File.jpg -AsByteStream | ncat 192.168.0.2 3333
    # 复制二进制文件
    Get-Content File.jpg -AsByteStream | Set-Content File1.jpg -AsByteStream
    
  2. PowerShell 5及以下版本:用-Encoding Byte参数
    Get-Content File.jpg -Encoding Byte | ncat 192.168.0.2 3333
    

另外,复制文件更推荐直接用Copy-Item命令,它本身就是为文件复制设计的,比管道+重定向更可靠:

Copy-Item C:\Path\File.jpg C:\Path\File1.jpg

内容的提问来源于stack exchange,提问作者alazyworkaholic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:27:27