![如何修复截断的 PowerShell 输出(即使我已指定 -width 300)](https://linux22.com/image/1485833/%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%E6%88%AA%E6%96%AD%E7%9A%84%20PowerShell%20%E8%BE%93%E5%87%BA%EF%BC%88%E5%8D%B3%E4%BD%BF%E6%88%91%E5%B7%B2%E6%8C%87%E5%AE%9A%20-width%20300%EF%BC%89.png)
我正在尝试获取外部硬盘上所有目录和文件的列表,每行一个完全限定的目录/文件路径。我在 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
简单地:
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"