Экспорт результатов скрипта в CSV - PullRequest
0 голосов
/ 16 мая 2018

Я искал скрипт, который просто перечисляет папки в общем ресурсе и их размер. Я нашел следующее, но я зациклен на том, как экспортировать вывод, который я вижу, в легко читаемый CSV. Меня удивляет, как нечто такое простое превратилось во что-то сложное. Предложения приветствуются!

$colItems = Get-ChildItem "C:\Users\user.name\Desktop" | 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"

}

Ответы [ 6 ]

0 голосов
/ 18 мая 2018

Присвойте некоторую переменную после получения всех сведений о файле с рабочего стола / из любого места и создайте Excel

$subFolderItems = Get-ChildItem "$home\Desktop" -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:\Users\thiyagu.a.selvaraj\Desktop\PowerShell\FileSizeOutput.xls 
0 голосов
/ 16 мая 2018

Есть несколько способов сделать это, но я думаю, что наименее запутанным было бы просто добавить эту информацию к элементу, используя Add-Member. Затем выведите нужные данные с помощью Export-Csv.

$colItems = Get-ChildItem "C:\Users\user.name\Desktop" | 
    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
0 голосов
/ 16 мая 2018

Вот один из способов использования пользовательских объектов:

Get-ChildItem "$home\Desktop" -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 "$home\Desktop\Folders.csv" -NoTypeInformation
0 голосов
/ 16 мая 2018

По моему мнению, использование CSV для вашего варианта использования не лучший план, потому что (в моей папке) есть файлы размером более 1000 МБ, поэтому csv разбивает файлы некоторых размеров.Чтобы создать файл с разделителями табуляции, который может быть легко проанализирован большинством систем, просто измените строку вывода сценариев.

Я изменил - на символ табуляции и добавил вывод в конце строки

"{0}`t{1:N2} MB" -f $i.fullname,($subFolderItems.sum / 1MB) >> output.csv

Последний скрипт приведен ниже;вам, вероятно, потребуется изменить output.csv на предпочитаемое расположение выходного файла.

$colItems = Get-ChildItem "C:\Users\user.name\Desktop" | 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
}
0 голосов
/ 16 мая 2018

По вашему сценарию:

## C:\Users\UserName\Desktop\Test\SO_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)\Desktop\your.csv" -NoType

Пример вывода (на другое дерево)

> $data

Folder          Size
------          ----
Q:\test\2018\03       0,37 MB
Q:\test\2018\04       0,83 MB
Q:\test\2018\05     383,57 MB

Раскомментируйте последнюю строку для записи в CSV-файл.

0 голосов
/ 16 мая 2018

Если вы не настаиваете на использовании чистого powershell, в Windows 10 (достаточно новой) вы можете просто вызвать bash:

bash -c "du -h | sed 's/\s\+/,/'"

Чтобы показать, как это влияет на полученный CSV, более длинный пример:

bash -c "du -m | sed 's/\([0-9]\+\)\s\+\(.*\)/\1MB,\2/'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...