簡體   English   中英

如何將 Select-String 編碼設置為 UTF-16?

[英]How to set Select-String encoding to UTF-16?

我有一個 PowerShell 腳本。 它執行生成 UTF-16 output 的 exe 文件,我將其通過管道傳輸到 Select-String 中,如下所示:

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

但是 PowerShell 報告說,編碼不受支持。

有解決方法來解決這個問題嗎? 真的不支持 UTF-16 嗎?

這是我想出的一個例子。 我不知道如何使它工作。

程序.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.!.
  • Select-String-Encoding參數從管道適用於字符串輸入,如同從一個外部程序輸出的情況。

    • 相反,它僅適用於文件輸入- 即通過管道作為Get-ChildItem / Get-Item調用的輸出或通過-Path / -LiteralPath參數傳遞的文件內容 -Encoding通常僅適用於所有標准 cmdlet 的文件內容。

    • -Encoding :正如Jeroen Mostert 所指出的,您看到的錯誤消息源於utf-16不是Windows PowerShell 中有效的-Encoding參數; (不幸的是),您必須使用誤稱Unicode來指代 UTF-16LE。

      • 使用Get-Help Select-String -Parameter Encoding查看支持的名稱或查閱在線文檔
      • 但是,請注意編碼名稱utf-16utf-16le PowerShell的(核心)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通信時如何處理字符編碼的更多信息,請參閱此答案

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

搜索當前目錄下的any.log文件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM