【问题标题】:Avoid unexpected characters in powershell stream-to-file output避免 powershell 流到文件输出中的意外字符
【发布时间】:2021-10-01 04:00:20
【问题描述】:

我希望得到以下 powershell 命令:

echo 'abc' > /test.txt

用 3 个字节填充文件 /test.txt0x61, 0x62, 0x63

如果我检查文件,我发现它的字节是(所有值都是十六进制):

ff fe 61 00 62 00 63 00 0d 00 0a 00

无论我尝试将什么输出流式传输到文件中,以下步骤都按给定顺序应用,转换生成的文件内容:

  1. \r\n (0d 0a) 附加到输出的末尾
  2. 在输出的每个字符后插入一个空字节 (00)
  3. 在整个输出前添加 ff fe

第 1 种转换相对可以忍受,但其他两种转换确实很痛苦。

如何使用 powershell 更精确地流式传输内容(无需这些转换)?

谢谢!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试这个

    'abc' | out-file -filepath .\test.txt -encoding ascii -nonewline
    

    应该得到 3 个字节而不是 12 个字节

    61 62 63
    

    【讨论】:

    • 有点冗长,但就像一个魅力 - 也只是提醒其他用户-nonewline 将删除实际内容中的任何换行符!
    • 'abc' | set-content -path .\test.txt -nonewline 也应该工作
    • @Gershy,添加一些信息:ff fe 开头是组成 UTF-16 LE BOM 的两个字节,因为在 Windows PowerShell >,由于是 Out-File 的有效别名,默认创建 UTF-16LE(“Unicode”)文件(幸运的是,PowerShell (Core) 7+ 现在默认使用 BOM-less UTF-8)。在 UTF-16LE 中,ASCII 范围字符具有 00 (NUL) 值,作为编码单个 (BMP) 字符的每个 2 字节代码单元的第 2 个字节。是的,不幸的是 -NoNewLine 删除了 all 换行符 - GitHub issue #5108 要求 -NoLastNewLine
    • 谢谢@mklement0,这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多