1

我有一个应用程序文件夹,其中包含 10 多个应用程序。我想列出所有文件(包括子文件夹)以及目录和大小信息,并将其保存在每个应用程序文件夹下。

这是脚本(它在 C:\Users\xxxxxx\Desktop\apps 中)

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    $thisPath = Get-Location
    Get-ChildItem -File -Filter * -Path $folder -Recurse |
    Sort-Object -Property Length -Descending|
    Select-Object -Property FullName, Length, @{l='Length (MB)';e={$_.Length/1MB}} | 
    Format-Table -AutoSize | 
    Out-File $thisPath\fileList_$folder.txt
}

输出:

全名 - 长度 - 长度 (MB)


C:\Users\xxxxxx\Desktop\apps\3\VSCodeUserSetup-x64-1.62.2.exe 79944464 76.2409820556641 C:\Users\xxxxxx\Desktop\apps\3\son.zip 18745870 17.8774547576904

它做了我想要的,但是在一些路径太长的输出中,它没有写出长度甚至完整的路径。

全名


C:\Users\xxxxxx\Desktop\apps\3\xxxxxxxxxxx/xxxxxx/xxxxxxxxxxxxxx/xxxxxxxxxxx/VSCodeUserSetu...
C:\Users\xxxxxx\Desktop\apps\3\son.zip

当我搜索时,我看到有一个字符限制。我该如何克服这个问题?

4

1 回答 1

3

-Path参数被定义为一个字符串数组,但您正在为其提供一个DirectoryInfo对象。

您问题的第二部分是关于截断,这是因为您Format-Table -AutoSize在数据上使用了截断。

Format-*cmdlet 旨在仅在宽度有限的控制台窗口上显示输出,并且所有较长的项目都将被截断。
经验法则:Format-*以后需要处理数据时,切勿使用 cmdlet。

我建议不要将格式化的表格保存到文本文件中,而是将(对象)信息保存为结构化的 CSV 文件,这使得以后处理数据更加容易并且不会被截断。(例如,您可以在 Excel 中打开它)

# just get an array of Full pathnames
$FolderList = (Get-ChildItem -Directory).Name #instead of Fullname
foreach ($folder in $FolderList) {
    # create the path for the output
    $fileOut = Join-Path -Path $folder -ChildPath ('filelist_{0}.csv' -f $folder)
    Get-ChildItem -File -Path $folder -Recurse |
    Sort-Object -Property Length -Descending |
    Select-Object -Property FullName, Length, @{l='Length (MB)';e={$_.Length/1MB}} | 
    Export-Csv -Path $fileOut -NoTypeInformation -UseCulture
}

我在 Export-Csv cmdlet 中添加了开关-UseCulture,因此您之后只需双击 csv 文件即可在 Excel 中打开它

于 2022-01-21T10:58:31.343 回答