如何修复截断的 PowerShell 输出(即使我已指定 -width 300)

如何修复截断的 PowerShell 输出(即使我已指定 -width 300)

我正在尝试获取外部硬盘上所有目录和文件的列表,每行一个完全限定的目录/文件路径。我在 Windows 10 上使用 PowerShell 来实现此目的。这是我正在使用的 PowerShell 命令:

Get-ChildItem 'E:\' -Force -Recurse | Select-Object FullName | Out-File -Encoding utf8 "C:\Users\Me\Desktop\listing.txt" -width 300

但是,我的输出中有些路径被截断了。事实上,有超过 10,000 行被截断了。以下是我的 listing.txt PowerShell 输出文件中一行的示例:

E:\Sort\Tech Stuff\2006-2007 CompanyLtd\fsie01-Engineering-Users-User1\Reference\LCID & Language Group by Language\Configuring and Using International Features of Windows Windows 2000 - List of Locale I...

当我在文件资源管理器中浏览此目录(E:\Sort\Tech Stuff\2006-2007 CompanyLtd\fsie01-Engineering-Users-User1\Reference\LCID & Language Group by Language)时,那里的文件名为“配置和使用 Windows Windows 2000 的国际功能 - 区域设置 ID 和语言组列表.url”。如果我没有算错的话,这个文件的路径长度为 228 个字符,这应该在可接受的范围内。

我做错了什么,导致我的 PowerShell 输出中的路径被截断?

答案1

管道输出至格式表命令行开关,例如如下:

Get-ChildItem 'E:\' -Force -Recurse | Select-Object FullName | Format-Table -AutoSize

或者

(Get-ChildItem 'E:\' -Force -Recurse).FullName | Format-Table -AutoSize

请注意, cmdlet-Width的参数Out-File指定了每行输出的字符数。任何超出的字符都将被截断,而不是换行。但是,-Width 300在这种情况下应该足够了。

答案2

首先,您需要通过对单个属性使用 ExpandProperty 来确保 Select-Object 不会被截断

Get-ChildItem 'E:\' -Force -Recurse | Select-Object -ExpandProperty FullName | Out-File -Encoding utf8 "C:\Users\Me\Desktop\listing.txt"

或者当有更多属性时通过管道传输到 format-table。
如果控制台中没有足够的空间,即使使用参数 autosize 和 wrap,Format-table 也会选择要显示的值。
因此,您需要使用 width 参数通过管道传输到 Out-String 以在控制台中查看所有内容,或者将 width 添加到 Out-File 以在输出文件中查看所有内容。

Get-ChildItem 'E:\' -Force -Recurse | Select-Object * | Format-Table | Out-String -width 9999

和 (

Get-ChildItem 'E:\' -Force -Recurse | Select-Object * | Format-Table | Out-File -width 9999 -Encoding utf8 "C:\Users\Me\Desktop\listing.txt"

或者

Get-ChildItem 'E:\' -Force -Recurse | Select-Object * | Format-Table | Out-String -width 9999 | Out-File -Encoding utf8 "C:\Users\Me\Desktop\listing.txt"

)
当值在集合/数组中时,输出由 $FormatEnumerationLimit 控制,
将其设置为 -1 表示无限制。

我知道这是一篇旧帖子,但我在寻找答案之前就发现了它。
所以我想分享我的发现。

答案3

对我来说,它最适合管道 export-csv

https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Export-Csv?view=powershell-3.0

简单地:

GCI 'E:\' -Recurse | Select FullName | Export-CSV Files.csv

不带双引号:

Add-Content -Path Files.txt -Value (GCI 'E:\' -Recurse).FullName

答案4

以下对我有帮助:

$FormatEnumerationLimit=-1

Your Command | Format-Table | Out-File -width 999999 -Encoding utf8 "C:\Temp\result.txt"

相关内容