在 powershell 中格式化带有列的文本文件

Formatting a text file with columns in powershell

我正在尝试从哈希表创建一个格式良好的 Txt 文件(必须是 Txt,不能是 CSV)。

这是我创建文本文件的代码

$hashTable.GetEnumerator() | Sort-Object Name |
ForEach-Object {"{0} `t`t: {1} `t`t: {2} `t`t: {3} `t`t: {4}" -f $_.DisplayName,$_.EmployeeNo,$_.Email, $_.SamName,$_.Upn}|
Add-Content $textFilePath

如您所见 - 当有人输入长名称的 Txt 文件时,它会弄乱格式,因为标签会随之移动。

我正在寻找一种可以动态设置文本文件中列宽的解决方案。

使用 PowerShell 的 output-formatting 系统,其 Format-Table cmdlet 生成 human-readable、column-aligned 表示,但请注意,这些通常是 而不是 suitable 用于稍后 程序化 处理:

($hashTable.GetEnumerator() | Sort-Object Name).Value | 
  Format-Table -AutoSize -Property DisplayName, EmployeeNo, Email, SamName, Upn | 
    Out-File $textFilePath -Encoding Utf8 -Width 1024 
  • $hashTable.GetEnumerator() | Sort-Object Name 将散列 table 条目枚举为 System.Collections.DictionaryEntry 条目并按它们的 .Name (.Key) 属性.

    • 请注意,.GetEnumerator() 调用对于按键(名称)对散列 table 条目 进行排序是必需的;没有它,散列 table 作为一个整体 将作为单个对象 通过管道发送 ,在这种情况下 Sort-Object 实际上是一个 no-op - 根据定义,如果只有一个对象,就没有什么可排序的;比较输出:
      @{ zach = 1; moe = 2; aardvark = 0 } | Sort-Object Name
      输出自:
      @{ zach = 1; moe = 2; aardvark = 0 }.GetEnumerator() | Sort-Object Name
      在第一个命令中,Sort-Object 调用无效。
  • .Value 然后提取条目的值(这也可以使用 ... | ForEach-Object Value 以流方式完成)。

  • 值似乎是 Active Directory 用户对象,因此您只需将所需 属性 names 的列表传递给 Format-Table,它们构成 output-table 列名称,而相应的 属性 values 构成列值。

  • 注意这里使用的是Out-File而不是Add-ContentSet-Content),因为只有它会自动转换格式objects Format-Table 输出到它们预期的字符串表示形式,正如您在控制台(终端)中看到的那样。

    • -Width 1024 确保 table 行不会根据当前控制台 window 的宽度被截断;根据需要调整。
    • -Encoding Utf8为例,控制输出编码;请注意 Windows PowerShell 默认为“Unicode” (UTF-16LE),而 PowerShell [Core] 中默认为 BOM-less UTF-8 ] v6+。有关 Windows PowerShell 与 PowerShell [Core] 中默认字符编码的更多信息,请参阅