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

标签 powershell object output text-files hashtable

我正在尝试从哈希表创建格式正确的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文件中时,它会弄乱格式,因为制表符只是被移动了。
enter image description here
我正在寻找一种可动态设置文本文件中列宽的解决方案。

最佳答案

使用PowerShell的输出格式系统,该系统的 Format-Table cmdlet生成易于阅读的,按列对齐的表示形式,但请注意,这些通常不适合以后的程序处理:

($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将哈希表条目枚举为System.Collections.DictionaryEntry条目,并按其.Name(.Key)属性对其进行排序。
  • 注意,.GetEnumerator()调用对于按哈希表项的键(名称)进行排序是必需的。没有它,整个哈希表将作为单个对象通过管道发送,在这种情况下,Sort-Object实际上将是无操作的-根据定义,如果只有一个对象,则没有排序的对象;比较以下输出:@{ 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用户对象,因此您可以将所需属性名称的列表传递给Format-Table,它们构成输出表的列名称,而相应的属性值构成列的值。
  • 请注意,使用Out-File而不是Add-Content(Set-Content),因为只有它会自动将Format-Table输出的格式设置对象转换为其预期的字符串表示形式,就像您在控制台(终端)中看到的那样。
  • -Width 1024确保不会根据当前控制台窗口的宽度而截断表行;根据需要进行调整。
  • -Encoding Utf8为例,控制输出编码。请注意,Windows PowerShell默认为“Unicode”(UTF-16LE),而默认值为PowerShell [Core] v6 +中的无BOM的UTF-8。有关Windows PowerShell与PowerShell [Core]中默认字符编码的更多信息,请参见this answer

  • 关于powershell - 在Powershell中格式化带有列的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64579269/

    相关文章:

    python - 如何从文本文件创建Python对象图(具有循环依赖)

    Azure Powershell 不创建具有多个端口的 NSG 规则

    windows - 使用所有参数从批处理文件调用 PowerShell 脚本

    c# - 如何在Unity3D中将变量从一个场景中的一个对象传递到另一个场景中的另一个对象?

    JavaScript ES6 : array of objects to array grouped by key and indexed by property

    c - 每次输出都相同

    c - 无法理解 C 程序的输出

    linux 内核 printk 输出

    azure - 使用 powershell 在 Azure 自动化帐户中设置 Api 版本

    windows - 检查当前用户 session 中是否有进程正在运行