如何防止将转义序列添加到PowerShell输出



我没有期望或想要输出中的转义序列。第一行输出是:

00000000000000001B 5B 33 32 3B 31 6D4C 6F 63 61 6C 41 64 64 72�[32;1mLocalAddr

PS C:srct> Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' } | Out-File -FilePath '.task3.txt' -Encoding ascii
PS C:srct> Get-Content .task3.txt -first 2 | Format-Hex
Label: String (System.String) <5F8755A9>
Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 1B 5B 33 32 3B 31 6D 4C 6F 63 61 6C 41 64 64 72 �[32;1mLocalAddr
0000000000000010 65 73 73 20 20 20 20 20 20 20 20 20 20 20 20 20 ess
0000000000000020 20 20 20 20 20 20 20 20 20 20 20 4C 6F 63 61 6C            Local
0000000000000030 50 6F 72 74 20 52 65 6D 6F 74 65 41 64 64 72 65 Port RemoteAddre
0000000000000040 73 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ss
0000000000000050 20 20 20 20 20 20 20 20 20 52 65 6D 6F 74 65 50          RemoteP
0000000000000060 6F 72 74 20 53 74 61 74 65 20 20 20 20 20 20 20 ort State
0000000000000070 41 70 70 6C 69 65 64 53 65 74 74 69 6E 67 20 4F AppliedSetting O
0000000000000080 77 6E 69 6E 67 50 72 6F 63 65 73 73 1B 5B 30 6D wningProcess**�[0m**

我注意到它没有出现在Get-ChildItem的输出中。

PS C:srct> dir *.g* | Out-File -FilePath '.task5.txt' -Encoding ascii
PS C:srct> Get-Content -Path '.task5.txt' -First 2 | Format-Hex
Label: String (System.String) <5A0214B6>
Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 20 20 20 20 44 69 72 65 63 74 6F 72 79 3A 20 43     Directory: C
0000000000000010 3A 5C 73 72 63 5C 74                            :srct

Tom的有用回答提出了一个重要观点:Out-*cmdlet的输出是为人类眼球准备的,而不是为programmable处理

抛开此不谈:

您的输出文件中存在ANSI/Virtual Terminal转义序列(在本例中用于生成彩色输出(,这意味着您正在使用PowerShell(Core(7.2+,其中$PSStyle.OutputRendering的值确定这些转义序列是保留在对Out-*cmdlet的隐式或显式调用的输出中

  • 使用$PSStyle.OutputRendering = 'Host'将格式化输出中的转义序列的使用限制为发送到显示器(主机/控制台/终端(的输出,并进行所有其他用途-通过管道将输出发送到具有>的文件(实际上是Out-File的别名(或-导致删除这些转义序列以生成纯文本输出。

    • $PSStyle.OutputRendering = 'Host'添加到$PROFILE文件中,使此行为成为未来会话的默认行为
  • 遗憾的是,从PowerShell 7.2.1开始,$PSStyle.OutputRendering默认值为'Ansi'无条件在格式化输出中包含转义序列。

    • 'Host'将提供一个更合理的默认值,这与类Unix平台上的CLI所表现出的行为一致,当其stdout输出未连接到终端时,CLI本身会绕过转义序列的使用,除非明确要求包括它们,并提供--color=always等选项

"Out-File cmdlet将输出发送到文件。它隐式地使用PowerShell的格式化系统来写入文件。该文件接收与终端相同的显示表示。这意味着,除非所有输入对象都是字符串,否则输出可能不适合编程处理"-来自文档。

当我在我的系统上运行你的代码行时,这些地址会被截断,这可能是你可能没有发现的另一个缺点。

您没有说明您最终想要使用该文件的目的,但export-csv会产生更有用的结果:

Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' } | export-csv '.task3.txt'

最新更新