我一直在寻找一个脚本,该脚本仅列出共享中的文件夹及其大小。我找到了以下内容,但我挂断了如何将我看到的输出导出为易于阅读的 CSV。令我惊讶的是,如此简单的事情是如何变成困难的。欢迎提出建议!
$colItems = Get-ChildItem "C:Usersuser.nameDesktop" | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
foreach ($i in $colItems)
{
$subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
$i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
}
根据您的脚本:
## C:UsersUserNameDesktopTestSO_50359947.ps1
$colItems = Get-ChildItem "$($Env:USERPROFILE)Desktop" |
Where-Object {$_.PSIsContainer} | Sort-Object
$data = ForEach ($i in $colItems){
$subFolderItems = Get-ChildItem $i.FullName -recurse -force -ea 0|
Where-Object {!$_.PSIsContainer} |
Measure-Object -Property Length -sum | Select-Object Sum
[PSCustomObject]@{
Folder = $i.FullName
Size = "{0,10:N2} MB" -f ($subFolderItems.sum / 1MB)
}
}
$data
#$data | Export-Csv "$($Env:USERPROFILE)Desktopyour.csv" -NoType
示例输出(在不同的树上)
> $data
Folder Size
------ ----
Q:test2018 3 0,37 MB
Q:test2018 4 0,83 MB
Q:test2018 5 383,57 MB
取消注释要写入 csv 文件的最后一行。
以下是使用自定义对象的一种方法:
Get-ChildItem "$homeDesktop" -Directory |
ForEach-Object {
$contents = Get-ChildItem -Path $_.FullName -Recurse
[PsCustomObject]@{
FolderName = $_.Name
SizeMB = [Math]::Round(($contents | Where-Object PsIsContainer -eq $false | Measure-Object -property Length -Sum).Sum / 1MB,2)
SubFolders = ($contents | Where-Object PsIsContainer -eq $true | Measure-Object).Count
Files = ($contents | Where-Object PsIsContainer -eq $false | Measure-Object).Count
}
}
这给出了如下输出:
FolderName SizeMB SubFolders Files
---------- ------ ---------- -----
Folder1 438.38 19 124
Folder2 34925.72 306 3779
要将其发送到CSV,只需在最后一个括号后附加以下内容:
| Export-Csv "$homeDesktopFolders.csv" -NoTypeInformation
有几种方法可以做到这一点,但我认为最不令人困惑的是简单地使用Add-Member
将该信息添加到项目中。然后通过Export-Csv
输出所需的数据。
$colItems = Get-ChildItem "C:Usersuser.nameDesktop" |
Where-Object {$_.PSIsContainer -eq $true} |
Sort-Object |
%{ Add-Member -InputObject $_ -NotePropertyName 'FolderSize' -NotePropertyValue (Get-ChildItem $_.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object -ExpandProperty Sum) -PassThru}
$colItems | Select FullName,FolderSize | Export-Csv -NoType
请在从桌面/任何位置获取所有文件详细信息并创建 excel 后分配给某个变量
$subFolderItems = Get-ChildItem "$homeDesktop" -Directory |
ForEach-Object {
$contents = Get-ChildItem -Path $_.FullName -Recurse
[PsCustomObject]@{
FolderName = $_.Name
SizeMB = [Math]::Round(($contents | Where-Object PsIsContainer -eq $false | Measure-Object -property Length -Sum).Sum / 1MB,2)
SubFolders = ($contents | Where-Object PsIsContainer -eq $true | Measure-Object).Count
Files = ($contents | Where-Object PsIsContainer -eq $false | Measure-Object).Count
}
}
$subFolderItems | out-file C:Usersthiyagu.a.selvarajDesktopPowerShellFileSizeOutput.xls
在我看来,为您的用例使用 CSV 并不是最好的计划,因为(在我的文件夹中)有超过 1000 MB 的文件,因此 csv 会分解一些文件大小。 要制作制表符分隔的文件(大多数系统都可以轻松解析该文件),只需修改脚本输出字符串即可。
我将 -- 更改为制表符,并在行尾添加了输出
"{0}`t{1:N2} MB" -f $i.fullname,($subFolderItems.sum / 1MB) >> output.csv
最终脚本如下;您可能需要将output.csv
更改为首选的输出文件位置。
$colItems = Get-ChildItem "C:Usersuser.nameDesktop" | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
foreach ($i in $colItems)
{
$subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
"{0}`t{1:N2} MB" -f $i.fullname,($subFolderItems.sum / 1MB) >> output.csv
}