我正在尝试从哈希表创建格式正确的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的输出格式系统,该系统的 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
以流方式完成)。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/