Сортировка размера папки Powershell с автоматическим преобразованием размера. Размер папки powershell


powershell - PowerShell script, чтобы найти размер файла и количество файлов в папке с миллионами файлов?

Если вы используете потоковое вещание и конвейерную обработку, вам следует уменьшить проблему с (3) много, потому что когда вы передаете поток, каждый объект передается по конвейеру по мере их поступления и не занимает много памяти, и вы должны иметь возможность обрабатывать миллионы файлов (хотя потребуется время).

Get-ChildItem $directory -recurse | Measure-Object -property length -sum

Я не верю, что утверждение @Stej, Get-ChildItem probably reads all entries in the directory and then begins pushing them to the pipeline., истинно. Конвейеризация - это фундаментальная концепция PowerShell (предоставить командлеты, скрипты и т.д.). Это гарантирует, что обработанные объекты передаются по конвейеру один за другим, когда и когда они доступны, а также только тогда, когда они необходимы. Get-ChildItem не будет вести себя иначе.

Отличный пример этого приведен в Понимание Pipeline Windows PowerShell.

Цитата из этого:

Команда Out-Host -Paging - полезный элемент конвейера, когда вы имеют длительный вывод, который вы хотели бы отображать медленно. это особенно полезно, если операция очень интенсивна для процессора. Потому как обработка передается командлету Out-Host, когда он имеет полная страница, готовая для отображения, командлеты, которые предшествуют ей в остановка трубопровода, пока не появится следующая страница выхода. Это можно увидеть, если вы используете диспетчер задач Windows для мониторинга процессора и использование памяти Windows PowerShell.

Выполните следующую команду: Get-ChildItem C:\Windows -Recurse. Сравните использование процессора и памяти с этой командой: Get-ChildItem C:\Windows -Recurse | Out-Host -Paging.

Тест на использование Get-ChildItem на c:\ (около 179516 файлов, а не миллионы, но достаточно хорошо):

Использование памяти после запуска $a = gci c:\ -recurse (а затем выполнение $a.count) было 527,332K.

Использование памяти после запуска gci c:\ -recurse | measure-object было 59,452K и никогда не было выше 80,000K.

(Память - Частный рабочий набор - из TaskManager, видя память для процесса powershell.exe. Первоначально это было около 22,000K.)

Я также пробовал с двумя миллионами файлов (мне понадобилось некоторое время для их создания!)

Аналогичный эксперимент:

Использование памяти после запуска $a = gci c:\ -recurse (а затем выполнение $a.count) было 2,808,508K.

Использование памяти во время работы gci c:\ -recurse | measure-object было 308,060K и никогда не превышало значение 400,000K. После этого он должен был сделать [GC]::Collect(), чтобы вернуться к уровням 22,000K.

Я по-прежнему убежден, что Get-ChildItem и конвейерная обработка могут дать вам большие улучшения в памяти даже для миллионов файлов.

qaru.site

Microsoft PowerShell. Размер каталога. - Alexander

Введение

Приветствую.  Если вы взялись за использование PowerShell не с вдумчивого чтения документации, тонны руководств или просмотра разной полезности материалов, то готов поклясться, столкнулись с вопросом - а как же узнать размер каталога через PS? Черт, когда я задался этим вопросом, моих знаний хватало лишь на то, чтобы использовать ls для посмотра файлов, а то, что ls вообще алиас на Get-ChildItem вообще стало открытием.Так что же, как быть, если вы простой парень, но вам просто позарез нужно получить размер каталога не выходя из PS, например, в процессе написания какого-либо сценария?

Суть  Итак, у нас есть каталог, с файлами и папками и мы ходим посчитать размер какой-либо папочки. Если просто ввести Get-ChildItem, то мы увидим, что у объектов типа "file" имеется атрибут Length в котором и записывается его текущий размер в байтах, а вот у объектов "Directory", они же наши папочки, такой атрибут хоть и присутствует, но является совершенно пустым.Да, этого никак не изменить, смиритесь, страдайте, тут нет аналога никсового du. Суть решения нашей задачи сводится к получению размера всех файлов, включая вложенные, и сложения атрибута Length. По сути, проводник Windows работает точно так же и если открыть любую папочку с тонной мелких файлов, мы сможем вживую увидеть как он этим занимается.Получить размер всех файлов какой-либо директории можно командой Get-ChildItem с ключом -Recurse - командлет пройдется по всей папке и вложенным подпапкам (следует учитывать безопасность - нет доступа к папке, нет размера).  ОК, мы получили огроменный список и теперь хотим сложить все поля Length каждого файла. В этом деле нам поможет командлет Measure-Object, которому по конвейеру мы передадим вывод Get-ChildItem и укажем какое поле, собственно, складывать.

Если не указывать ключа -Sum, то Measure-Object просто посчитает вам количество файлов с атрибутом Length. Вот, собственно говоря и всё - у вас есть размер каталога Program Files в байтах. Конечно, гораздо удобнее воспринимать его в мегабайтах или каких-нибудь гигабайтах и чтобы этого добиться придется чуть-чуть напрячь мозг и знать некоторые правила обращения с объектами PS и уметь не путаться в скобочках.Используя конструкцию "(выражение).параметр" мы выбрали Sum из полученного выше объекта, а уже после поделили его на 1 мегабайт. Чтобы получить размер в килобайтах, гигабайтах или терабайтах, делить нужно на 1Kb, 1Gb или 1Tb соответственно.Совершенно не сложно, когда знаешь что к чему, но что мешало парням из MS запилить командлет типа Get-DirSize, убейте, не пойму. К слову, его легко сделать самому, используя функции.

Всем удачи. =)

asand3r.livejournal.com

PowerShell, чтобы найти размер папки/файла

Я пытаюсь написать сценарий с помощью PowerShell, чтобы получить размер папки/файла, как указано ниже

$StartFolder = "D:\" $Output = "C:\Temp\test-d.csv" Add-Content -Value "Folder Path|Size" -Path $Output $colItems = (Get-ChildItem $startFolder -Recurse | Measure-Object -Property Length -Sum) "$StartFolder -- " + "{0:N2}" -f ($colItems.Sum/1MB) + " MB" # | Out-File $Output $colItems = (Get-ChildItem $startFolder -Recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object -Property Length -Sum) $i.FullName + "|" + "{0:N2}" -f ($subFolderItems.Sum/1MB) + " MB" | Out-File $Output -Append }

я получаю сообщение об ошибке, как указано ниже:

Measure-Object : The property "Length" cannot be found in the input for any objects. At line:12 char:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand Measure-Object : The property "Length" cannot be found in the input for any objects. At line:12 char:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Кроме того, когда я целевой диск с: Я получаю «доступ запрещен» на некоторых системных файлов:

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied. At line:12 char:28 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

stackoverrun.com

Powershell размер папки сортировки с преобразованием авто размер

У меня есть сценарий PowerShell, который получит имя папки, LastWriteTime, размер

cd \myfolder get-childitem | where {$_.PSIsContainer} | foreach { $size = (Get-ChildItem $_ -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum $obj = new-object psobject add-member -inp $obj noteproperty path $_.Name add-member -inp $obj noteproperty time $_.LastWriteTime add-member -inp $obj noteproperty size $size $obj }

, в результате чего путь/имя, LastWriteTime, размер

path time size ---- ---- ---- Audit_data_network_8-FEB-2017 2/8/2017 10:59:33 AM 1071084 dec-2015 1/25/2016 10:05:07 AM 29742775 games 2/15/2016 11:33:02 AM 52134862 kolachi 12/2/2015 3:37:27 PM 12487862 lighroom_ 5/29/2015 2:13:10 PM 2788765 Mini_Remote_Control7.5.9.0_Portable 6/13/2014 3:58:08 PM 52406834 ps 2/20/2017 4:23:10 PM 126707 totalcmd 1/25/2017 4:20:48 PM 11113908

Я хочу для изменения результата для добавления следующей функции:

  • Показать размер в КБ/МБ/ГБ автоматически
  • Сортировать результат с Размер (наиболее часто используемых папок Размер по выше)

Чтобы добавить функцию преобразования авто, я обнаружил следующее на каком-то форуме

# If ($size -lt 1KB) { $sizeOutput = "$("{0:N2}" -f $size) B" } #ElseIf ($size -lt 1MB) { $sizeOutput = "$("{0:N2}" -f ($size/1KB)) KB" } #ElseIf ($size -lt 1GB) { $sizeOutput = "$("{0:N2}" -f ($size/1MB)) MB" } #ElseIf ($size -lt 1TB) { $sizeOutput = "$("{0:N2}" -f ($size/1GB)) GB" } #ElseIf ($size -lt 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1TB)) TB" } #ElseIf ($size -ge 1PB) { $sizeOutput = "$("{0:N2}" -f ($size/1PB)) PB" } #Write-Output $sizeOutput

, но я действительно stucked из последних 2-3 дней из-за мое отсутствие знаний в этом вопросе сценариев, HOWTO, чтобы объединить его с существующим сценарием и получить свои желаемые результаты ... Любой помощи будет очень ценна ...

windows bash powershell powershell-v2.0394

stackoverrun.com

Получаем отчеты по сетевым папкам с помощью PowerShell / Блог компании Netwrix / Хабр

Джеффри Хикс опубликовал очередную статью по PowerShell, посвященную на этот раз управлению файловыми серверами. Мы решили разбить ее на две части: построение отчетов по файловому серверу и непосредственно управление файловыми шарами. В первой части рассмотрим отчеты. В посте будут рассмотрены следующие вопросы:
  • Как вывести список всех сетевых папок на компьютере (компьютерах)
  • Создаем отчеты о размерах сетевых папок
  • Определяем владельцев файлов
  • Находим дату создания файлов выявляем «старые» файлы и файлы, созданные за определенный промежуток времени)
Итак, под катом вы найдете перевод статьи File Server Management with Windows PowerShell.
Получаем все сетевые папки
Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.Get-WmiObject -class -Win32_Share -computername chi-fp01

Вместо chi-fp01 укажем имя интересующего нас компьютера

Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.

Добавим фильтр в первоначальную команду:

Get-WmiObject -class -Win32_Share -computername chi-fp01 –filter "Type=0"

Тем самым мы выводим только нужную информацию.

Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:

Get-WmiObject -Class win32_share -computername chi-fp01 –filter "Type=0 AND name like '%$'"

В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.

Get-WmiObject -Class win32_share -computername chi-fp01–filter "type=0 AND name like '%[^$]'"

Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя не заканчивается на $.

Получаем размер сетевой папки

Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:

dir c:\shares\public -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum -Minimum -Maximum

В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.

Пример 1: Отчет о размерах высокоуровневых сетевых папок

$share=Get-WmiObject -Class Win32_Share -ComputerName CHI-FP01 -filter "name='Sales'" $sb={ Param ($path) dir $path | where {$_.PSIscontainer} | foreach { $stats=dir $_.Fullname -recurse -errorAction "SilentlyContinue" | where {-NOT $_.PSIscontainer} | Measure-object -Property Length -sum New-Object -TypeName PSObject -Property @{ Computername=$env:Computername Path=$_.Name Fullname=$_.Fullname SizeKB=[math]::Round(($stats.sum/1KB),2) NumberFiles=$stats.count } #property } #foreach } #sb $results=Invoke-Command -ScriptBlock $sb -ComputerName $share.__SERVER -ArgumentList @($share.path) -HideComputerName

Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:

$results | Format-Table Computername,Fullname,SizeKB,NumberFiles -autosize

Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.

Пример 2: Отчет об использовании файловых шар

$sb={ #Get the file shares locally. $shares=Get-WmiObject -Class Win32_Share -filter "type=0" foreach ($share in $shares) { #Suppress any access denied error messages. Write-Host "Measuring $($share.path)" -ForegroundColor Green $stats=dir $share.path -Recurse -ErrorAction SilentlyContinue | Where {-Not $_.PSIscontainer} | Measure-Object -Property Length -Sum $hash=@{ Computername=$env:Computername Path=$share.path Share=$share.Name SizeKB=[math]::Round(($stats.sum/1KB),2) Files=$stats.count } #Write a custom object to the pipeline for each share. New-Object -TypeName PSObject -Property $hash } #foreach $share }#sb $results = Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01 -HideComputerName

И снова я слегка отформатирую таблицу.

$results | sort SizeKB –Descending | Select Computername,Share,SizeKB,Files | ft -auto

Получаем файлы по владельцу

Двигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уже наверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, который включает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файла в качестве кастомного свойства

$data=dir | where {-not $_.PSIsContainer} | select name, @{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}}, length

Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.

$data | group owner | Select Name,Count,@{Name="Size";Expression={($_.Group | Measure-Object -Property Length -sum).Sum}}

Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в коде примера 3.

Пример 3: Группируем файловые шары по владельцу

$sb={ Param($path) $data=dir $path | where {-not $_.PSIsContainer} | select name, @{Name="Owner";Expression= {(Get-ACL $_.fullname).Owner}},length $data | group -property owner | Select @{Name="Computername";Expression={$env:computername}}, @{Name="Path";Expression={$path}},Name,Count,@{Name= "Size";Expression={ ($_.Group | Measure-Object -Property Length -sum).Sum}} } #sb <# Run the command remotely and suppress the RunspaceID since we don't really need it. #> Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01 -ArgumentList @("c:\shares\public") -HideComputerName | Select * -ExcludeProperty RunspaceID

Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.

Опять выведем читаемую таблицу.

$data | Sort Size | ft -auto

Получаем файлы по дате создания

Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать. Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:

get-item c:\work\wishlist.txt | Format-List Name,*time дает вывод, представленный на скриншоте ниже.

Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.

Пример 4. Определяем возраст файлов

PS C:\work> get-item wishlist.txt | format-list name, CreationTime,LastWriteTime, >> @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}}, >> @{Name="Days";Expression={((Get-Date) -$_.LastWriteTime).TotalDays}} >> Name : wishlist.txt CreationTime : 11/23/2010 10:31:10 PM LastWriteTime : 2/15/2011 7:36:34 AM Age : 511.06:42:17.4251748 Days : 511.279372271039

Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.

dir c:\shares\public -recurse | Select Fullname,CreationTime,LastWriteTime, @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}}, @{Name="Days";Expression={[int]((Get-Date) -$_.LastWriteTime).TotalDays}}, @{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}} | Where {$_.Days -ge 400} | Sort Days -Descending

Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.

Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда. Одной из моих любимых техник является определение того, сколько файлов было изменено за год.

dir c:\shares\sales -recurse | Select Fullname,LastWriteTime, @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}}, @{Name="Year";Expression={$_.LastWriteTime.Year}} | Group-Object Year | Sort Name

Как вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можно проанализировать свойство Group, которое представляет собой коллекцию файлов.

Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.

Пример 5: Определяем период изменения файлов

$path="c:\scripts" #Get some other properties in case we want to further #break down each bucket. $files=dir $path -recurse | Select Fullname,CreationTime,LastWriteTime,Length, @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}}, @{Name="Days";Expression={[int]((Get-Date) -$_.LastWriteTime).TotalDays}} $hash=@{ Path=$path Over= ($files | Where {$_.Days -gt 365} | Measure-Object).Count '365Days'= ($files | Where {$_.Days -gt 180 -AND $_.Days -le 365} | Measure-Object).Count '180Days'= ($files | Where {$_.Days -gt 90 -AND $_.Days -le 180} | Measure-Object).Count '90Days'= ($files | Where {$_.Days -gt 30 -AND $_.Days -le 90} | Measure-Object).Count '30Days'= ($files | Where {$_.Days -gt 7 -AND $_.Days -le 30} | Measure-Object).Count '7Days'= ($files | Where {$_.Days -gt 0 -AND $_.Days -le 7} | Measure-Object).Count } New-Object -TypeName PSObject -Property $hash | Select Path,Over,365Days,180Days,90Days,30Days,7Days

На рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами, которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой код не включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.

За основу поста использована первая часть статьи File Server Management with Windows PowerShell.

Бонус:

Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).

habr.com

powershell - PowerShell, чтобы найти размер папки/файла

Я пытаюсь написать сценарий, используя powershell, чтобы получить размер папки/файла, как указано ниже

$StartFolder = "D:\" $Output = "C:\Temp\test-d.csv" Add-Content -Value "Folder Path|Size" -Path $Output $colItems = (Get-ChildItem $startFolder -Recurse | Measure-Object -Property Length -Sum) "$StartFolder -- " + "{0:N2}" -f ($colItems.Sum / 1MB) + " MB" # | Out-File $Output $colItems = (Get-ChildItem $startFolder -Recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object -Property Length -Sum) $i.FullName + "|" + "{0:N2}" -f ($subFolderItems.Sum / 1MB) + " MB" | Out-File $Output -Append }

Я получаю ошибку, как указано ниже:

Measure-Object : The property "Length" cannot be found in the input for any objects. At line:12 char:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand Measure-Object : The property "Length" cannot be found in the input for any objects. At line:12 char:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Кроме того, когда я нацелен на диск C: я получаю "доступ запрещен" на некоторых системных файлах:

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied. At line:12 char:28 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand задан V T 18 июля '17 в 4:20 источник поделиться

qaru.site

windows - Сортировка размера папки Powershell с автоматическим преобразованием размера

У меня есть сценарий powershell, который получает папку Name, LastWriteTime, Size

cd \myfolder get-childitem | where {$_.PSIsContainer} | foreach { $size = ( Get-ChildItem $_ -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum $obj = new-object psobject add-member -inp $obj noteproperty path $_.Name add-member -inp $obj noteproperty time $_.LastWriteTime add-member -inp $obj noteproperty size $size $obj }

Результат в пути/имени, LastWriteTime, Size

path time size ---- ---- ---- Audit_data_network_8-FEB-2017 2/8/2017 10:59:33 AM 1071084 dec-2015 1/25/2016 10:05:07 AM 29742775 games 2/15/2016 11:33:02 AM 52134862 kolachi 12/2/2015 3:37:27 PM 12487862 lighroom_ 5/29/2015 2:13:10 PM 2788765 Mini_Remote_Control7.5.9.0_Portable 6/13/2014 3:58:08 PM 52406834 ps 2/20/2017 4:23:10 PM 126707 totalcmd 1/25/2017 4:20:48 PM 11113908

Я хочу изменить результат, чтобы добавить следующую функцию

  • Показать размер в KB/Mb/GB автоматически
  • Сортировка результата с помощью размера (обычно используемая папка размером выше)

Чтобы добавить функцию автоматического преобразования, я нашел следующее на каком-то форуме

# If ( $size -lt 1KB ) { $sizeOutput = "$("{0:N2}" -f $size) B" } #ElseIf ( $size -lt 1MB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1KB)) KB" } #ElseIf ( $size -lt 1GB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1MB)) MB" } #ElseIf ( $size -lt 1TB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1GB)) GB" } #ElseIf ( $size -lt 1PB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1TB)) TB" } #ElseIf ( $size -ge 1PB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1PB)) PB" } #Write-Output $sizeOutput

но я действительно застрял от последних 2-3 дней из-за моей нехватки знаний в этом вопросе сценариев, как слить его с существующим скриптом и получить мои желаемые результаты... Любая помощь будет очень оценена...

источник поделиться

qaru.site