PowerShell возраст файла в месяцах - PullRequest
0 голосов
/ 30 мая 2018

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

Get-ChildItem | Group {$_.LastWriteTime.ToString("MM")} | Sort Name | 
    Format-Table Name,Count -auto

Name Count
---- -----
05       2
07       8
10       3
11       2

но я ищу:

Age in Months   Storage Space Used (MB)
0                 100 MB
1                 120 MB
2                 50 MB
3                 20 MB
4                 10 MB
5                 5 MB

Кто-нибудь может помочь?

Ответы [ 4 ]

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

Вы можете использовать PowerShellHumanizer модуль.Он добавляет пользовательский формат таблицы файловой системы, так что вы увидите это:

PS C:\> Get-ChildItem


    Directory: C:\Program Files\7-Zip


Mode     LastWritten         Length Name
----     -----------         ------ ----
da----   9 months ago               Lang
-a----   one year ago         93 KB 7-zip.chm
-a----   one year ago         79 KB 7-zip.dll
-a----   one year ago         49 KB 7-zip32.dll
-a----   one year ago          1 MB 7z.dll
-a----   one year ago        414 KB 7z.exe
-a----   one year ago        178 KB 7z.sfx
-a----   one year ago        163 KB 7zCon.sfx
-a----   one year ago        784 KB 7zFM.exe
-a----   one year ago        533 KB 7zG.exe
-a----   4 years ago          366 B descript.ion
-a----   one year ago         40 KB History.txt
-a----   one year ago          2 KB License.txt
-a----   one year ago          2 KB readme.txt
0 голосов
/ 31 мая 2018

Следующие сценарии группируются по yyyy-MM и используют функцию Get-FriendlySize

## https://stackoverflow.com/q/50535131/6811411
function Get-FriendlySize {
    param($Bytes)
    $sizes='Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ','
    for($i=0; ($Bytes -ge 1kb) -and 
        ($i -lt $sizes.Count); $i++) {$Bytes/=1kb}
    $N=2; if($i -eq 0) {$N=0}
    "{0,6:N$($N)} {1}" -f $Bytes, $sizes[$i]
}


Get-ChildItem | Group {$_.LastWriteTime.ToString("yyyy-MM")}| Sort Name -Desc|ForEach {
   [pscustomobject]@{
       'FileAge' = $_.Name
       'Space Used'= (Get-FriendlySize (($_.Group|measure Length -sum).sum) )
    }
 }

Пример вывода (немецкий язык с десятичной запятой)

FileAge Space Used
------- ----------
2018-05    364 Bytes
2017-08  18,12 KB
2017-07  10,30 KB
2017-06  52,44 KB
2017-05   1,77 KB
2017-04    606 Bytes
2017-03  24,85 KB
2017-02   8,45 KB
2017-01  14,54 KB
2016-12  27,22 KB
2016-11 160,85 KB
2016-10   1,33 MB
2016-09 338,42 KB
2016-08   1,76 MB
0 голосов
/ 31 мая 2018

Вы хотите сгруппировать по числу месяцев между созданием файла и сейчас, а не по месяцу создания?Если это так, то использование New-Timespan должно помочь, примерно так:

ls -File | % {
    New-Object psobject -Property @{
        Age = [int]((New-TimeSpan -Start $_.LastWriteTime).Days / 31)
        Size = ($_.Length) 
    }
} | Group-Object Age | Select @{
    Name = 'Age in Months'
    Expression = {[int]($_.Name)}}, 
    @{Name ='Storage Size Used (MB)'
    Expression = {[int](($_.Group.Size | Measure-Object -Sum).Sum / 1MB)}
} | sort 'Age in Months'
0 голосов
/ 31 мая 2018

Я думаю, что это может достичь того, что вы собираетесь.Не уверен, что это самый чистый способ, но я все еще учусь сам.

get-childitem | Select-Object Name, @{
    Name = "Age in Months" ;
    e = {[int](((Get-date) - ($_.lastwritetime)).days/30)} 
 } ,

 @{
    Name="Storage Spaced Used (MB)" ;
    e = {[math]::Round($_.Length / 1MB, 2 )}
 } | 



Sort-Object -property "Age in months"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...