如何将Select-String编码设置为UTF-16?

4
我有一个PowerShell脚本。 它执行exe文件,该文件会产生UTF-16输出并且我正在使用以下方式将其导入到Select-String中:
& "my.exe" | Select-String -Pattern "skipping non-regular file" -NotMatch -Encoding "utf-16"

但PowerShell报告说,该编码不受支持。

有没有解决方法?UTF-16真的不被支持吗?


5
在.NET中,该编码的名称是Unicode,而不是utf-16 - Jeroen Mostert
输出是否以BOM开头? - lit
你能尽可能简单地发布一个源代码示例吗? - js2010
3个回答

1
  • Select-String-Encoding参数不适用于从管道中输入的字符串,就像来自外部程序的输出一样。

    • 相反,它仅适用于文件输入 - 即通过管道作为Get-ChildItem/Get-Item调用的输出或通过-Path/-LiteralPath参数传递的文件的内容。 -Encoding通常仅适用于所有标准cmdlet中的文件内容。

    • 此外:正如Jeroen Mostert所指出的那样,您看到的错误消息源于在Windows PowerShellutf-16不是有效的-Encoding参数;(不幸的是),您必须使用误称的Unicode来引用UTF-16LE。

      • 使用Get-Help Select-String -Parameter Encoding查看支持的名称或查阅在线文档
      • 但是,请注意,编码名称utf-16utf-16lePowerShell(Core)7+中可以使用,在这里-Encoding另外接受来自所有可用.NET编码的名称或代码页号,如[System.Text.Encoding] :: GetEncodings()所报告的。
  • 相反,您必须(暂时)将[Console] :: OutputEncoding设置为UTF-16LE(“Unicode”),以使PowerShell正确解码来自外部程序的UTF-16LE输出,如下所示。

$prev = [Console]::OutputEncoding # Save current value.

# Tell PowerShell to interpret external-program output as 
# UTF-16LE ("Unicode") encoded.
[Console]::OutputEncoding = [System.Text.Encoding]::Unicode

& "my.exe" |
  Select-String -Pattern "skipping non-regular file" -NotMatch

[Console]::OutputEncoding = $prev # Restore previous value.

另请参阅:

  • 有关PowerShell在与外部程序通信时处理字符编码的更多信息,包括辅助函数Invoke-WithEncodingDebug-NativeInOutput,请参见此答案

0

PowerShell 可以搜索字符串。搜索适用于 ASCII 和 UTF-16 日志文件。

在当前目录中搜索任何 .log 文件:

get-content "*.log" | Select-String -Pattern "Configuration completed successfully."

0

这里是我想出来的一个例子,但我不确定怎么让它工作。

Program.cs:

using System;
using System.Text;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Byte[] byteOrderMark;
            byteOrderMark = Encoding.Unicode.GetPreamble();
            //Console.OutputEncoding = new UnicodeEncoding(false, true); 
            Console.OutputEncoding = System.Text.Encoding.Unicode;
            Console.WriteLine("Hello World!");
        }
    }
}

$env:path += ';C:\Windows\Microsoft.NET\Framework64\v4.0.30319'
csc Program.cs

# no output for either
.\Program | select-string Hello
.\Program | select-string Hello -encoding unicode


# no 'FF FE' BOM
.\program | Format-Hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00  H.e.l.l.o. .W.o.
00000010   72 00 6C 00 64 00 21 00                          r.l.d.!.

如果你想要费心查找每个字母之间的空值:
 .\program | select-string h`0e

H e l l o   W o r l d !

对我来说,即使 Windows 终端可用,使用 utf8 和 PowerShell ISE 仍然是最佳选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接