将脚本结果导出为 CSV



我一直在寻找一个脚本,该脚本仅列出共享中的文件夹及其大小。我找到了以下内容,但我挂断了如何将我看到的输出导出为易于阅读的 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:test20183       0,37 MB
Q:test20184       0,83 MB
Q:test20185     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
}

最新更新