使用 powershell 字符限制问题列出所有具有大小的文件
List all files with size using powershell char limit issue
我有一个应用程序文件夹,其中有超过 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
当我搜索时,我看到有一个字符限制。我该如何解决这个问题?
-Path
参数被定义为一个字符串数组,但是你给它提供了一个 DirectoryInfo
对象。
你问题的第二部分是关于截断的,这是因为你对数据使用了 Format-Table -AutoSize
。
Format-*
cmdlet 旨在 在控制台上显示 输出 window 仅宽度有限,所有较长的项目都被截断。
经验法则:当您以后需要处理数据时,切勿使用 Format-*
cmdlet。
我建议将(对象)信息保存为结构化 CSV 文件,而不是将格式化的 table 保存到文本文件,这样可以在以后更轻松地处理数据,而且不会被截断。 (例如,您可以在 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
这样您之后就可以简单地 double-click csv 文件在您的 Excel
我有一个应用程序文件夹,其中有超过 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
当我搜索时,我看到有一个字符限制。我该如何解决这个问题?
-Path
参数被定义为一个字符串数组,但是你给它提供了一个 DirectoryInfo
对象。
你问题的第二部分是关于截断的,这是因为你对数据使用了 Format-Table -AutoSize
。
Format-*
cmdlet 旨在 在控制台上显示 输出 window 仅宽度有限,所有较长的项目都被截断。
经验法则:当您以后需要处理数据时,切勿使用 Format-*
cmdlet。
我建议将(对象)信息保存为结构化 CSV 文件,而不是将格式化的 table 保存到文本文件,这样可以在以后更轻松地处理数据,而且不会被截断。 (例如,您可以在 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
这样您之后就可以简单地 double-click csv 文件在您的 Excel