首页 > 解决方案 > 为什么所有的 Powershell 输出都没有写入 txt 文件

问题描述

我有以下在 Powershell Core 中运行的 Powershell 脚本:

 PS C:\> Get-ChildItem -Recurse -File -Filter *.pbix | 
Sort-Object -Property LastAccessTime | 
Select-object -Property Name, FullName, LastAccessTime, LastWriteTime -Last 10 
>> files.txt

打开文件 files.txt 没有 LastAccessTime、LastWriteTime 的列 - 为什么会这样以及如何修改脚本以便将它们包含在文本文件中?

标签: powershell

解决方案


两个旁白:

  • >>Out-File -Append;的(虚拟)别名 如果意图不是附加(到预先存在的文件),而是仅捕获当前命令的(整个)输出,请使用 just >/ Out-File without -Append

  • Out-File因此也>/>>捕获文件中输入对象的显示表示,这适合后续的程序处理。对于后者,请使用生成结构化输出的 cmdlet,例如Export-Csv.

也就是说,鉴于目标是文件而不是显示器,因此期望Out-File捕获所有用于显示的数据是合理的。

遗憾的是,从 PowerShell [Core] v7.0 开始,Out-File//对控制台>>>终端)窗口的宽度(仍然)敏感,并且仅捕获当前屏幕上所能容纳的宽度。

您可以使用Out-File参数-Width来解决这个问题:

Get-ChildItem -Recurse -File -Filter *.pbix |
  Sort-Object -Property LastAccessTime |
    Select-object -Property Name, FullName, LastAccessTime, LastWriteTime -Last 10 |
      Out-File -Width ([int]::MaxValue-1) files.txt # Add -Append, if needed.

注意:从 v7.0 开始,[int]::MaxValue-1似乎是接受的最高值;[int]::MaxValue悄悄地忽略了。此外,请确保不要在Windows PowerShell中使用如此高的值,其中每个输出行都无条件地右空格填充到该长度,这会导致文件过大。


推荐阅读