为什么所有 Powershell 输出未写入 txt 文件?

3

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

 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 的列 - 这是为什么?如何修改脚本以包含它们在文本文件中?

1
我建议使用CSV文件来存储结构化数据,而不是纯文本。可以看一下cmdlet Export-Csv - Olaf
3
“Out-File” 命令在显示屏幕上的空间有限,如果屏幕不能适应所有数据,则无法显示全部数据。您可以尝试将输出存储到变量中,例如 $test = Get-ChildItem -Recurse -File -Filter *.pbix | Sort-Object -Property LastAccessTime | Select-object -Property Name, FullName, LastAccessTime, LastWriteTime -Last 10 ,然后您就可以使用 $test.LastWriteTime 访问任何数据。 - Nico Nekoru
1个回答

4

两个注意事项:

  • >>Out-File -Append 的(虚拟)别名;如果意图不是追加(到现有文件),而只是捕获当前命令的(全部)输出,请只使用 > / Out-File不要 使用 -Append

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

话虽如此,可以合理地期望 Out-File 捕获 所有 用于显示的数据,因为目标是 文件 而不是显示。

遗憾的是,在 PowerShell [Core] v7.0 中,Out-File / > / >> 仍然对控制台(终端)窗口的宽度敏感,并且仅捕获当前屏幕上可以 适应的内容

您可以使用带有 -Width 参数的 Out-File 来解决此问题:

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中使用如此高的值,因为每个输出行都无条件地向右填充到该长度,这将导致文件过大。


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