2017-02-22 3 views
1

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

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, чтобы объединить его с существующим сценарием и получить свои желаемые результаты ... Любой помощи будет очень ценна ...

ответ

3

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

Get-FoldersWithSize.ps1:

param ($Path = ".") 

$PrettySizeColumn = @{name="Size";expression={ 
    $size = $_.Size 
    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" } 
    $sizeOutput 
}} 

Get-ChildItem -Path $Path | Where-Object {$_.PSIsContainer} | ForEach-Object { 
    $size = (Get-ChildItem -Path $_.FullName -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 
    $obj = new-object -TypeName psobject -Property @{ 
     Path = $_.Name 
     Time = $_.LastWriteTime 
     Size = $size 
    } 
    $obj 
} | Sort-Object -Property Size -Descending | Select-Object Path, Time, $PrettySizeColumn 

Использование:

#Current directory (default value) 
.\Get-FoldersWithSize.ps1 

#Relative path 
.\Get-FoldersWithSize.ps1 -Path ".\Downloads" 

#Absolute path 
.\Get-FoldersWithSize.ps1 -Path "C:\ProgramData" 
+0

Это сообщество благословляет для начинающих и онемевшие-гайки, как я :) Это работало 100% совершенен. Большое спасибо за ваше время. Просто еще одна вещь. Что делать, если я хочу предоставить Папку по моему выбору (например, мы используем $ 1 в скрипте) /Пример: script.ps1 c: \ temp (папка по моему выбору, так что мне не нужно жестко указывать ее в скрипте) –

+1

Удалите 'cd \ myfolder" и указать путь для первого вызова Get-ChildItem. Я обновил ответ для работы как скрипт с параметром (последнее редактирование ...) –

+0

** получил ** ** Это сработало красиво :) Салют ко всем! –

Смежные вопросы