Hjälp med ett powershell script?

Permalänk
Medlem

Hjälp med ett powershell script?

Hej,
Jag tänkte köra ett powershell script i schemaläggaren på min server som ska kolla igenom D: och E: och fall om det är mindre än 50GB ledigt utrymme kvar så skall scriptet om möjligt radera dom äldsta filerna så det blir minst 100GB ledigt.

Jag kan inget om powershell script men mitt tankesätt är te.x:

Check D: if space <=50GB then
delete six oldest files.
Check D: - if space <=100GB then
delete six oldest files.
(Så loopar det tills det är 100GB ledigt)
else if space => 100GB then
Close

Visa signatur

Supermicro X9SRI-F | Xeon E5-2690 v2 | 128GB 1600MHz RDIMM | Dell Perc H200 (9211-8i IT) | Windows Server 2016 DataCenter med Hyper-V

Permalänk
Legendarisk

@Calby: Det här är ett bra scenario för en priority queue, som kan hålla ordning på de äldsta filerna som tillsammans tar upp en viss storlek; på så sätt räcker det att du scannar filsystemet en gång, samtidigt som du inte behöver minnas alla filer. Tyvärr tror jag inte att .NET tillhandahåller någon färdig implementation, utan du får leta upp eller skriva en (i t.ex. C#) som kan användas via PowerShell. Handlar det om ett begränsat antal filer så kanske det räcker att lista alla, sortera efter ålder och, välja de äldsta still dess att summan av deras storlekar är större än eller lika med målet:

$size = 0 $target = 0 $files = @() Get-ChildItem -Path "/path/to/search" -Recurse | ?{ -Not $_.PSIsContainer } | Sort-Object CreationTime | %{ $files += $_ } foreach($file in $files) { if($size -ge $target) { break } Remove-Item $file.FullName -WhatIf $size += $file.Length }

Annars, och om det är ett alternativ att använda t.ex. Python istället så kan du använda heapq. Här är ett snabbt exempel som skriver ut de äldsta filerna som tillsammans tar upp minst en viss storlek:

from os import walk from os.path import join, realpath, getctime, getsize from heapq import heappop, heappush # Helper def all_files(path): for dir, _, files in walk(realpath(path)): for file in files: yield join(dir, file) def oldest_files(path, target): heap = [] size = 0 # För varje fil i mappen... for file in all_files(path): # Skjut in den i heapen och öka på storleken... heappush(heap, (-getctime(file), getsize(file), file)) size += getsize(file) # Medans vi är över målstorleken ... while size > target: top = heap[0] # ... och det är möjligt att slänga den nyaste # filen utan att gå under gränsen igen, # gör det, och uppdatera storleksräknaren: if top[1] < size - target: heappop(heap) size -= top[1] # ... annars är det inte möjligt att slänga # något utan att riskera att gå under gränsen # för vad vi måste frigöra, och vi avbryter # för att se om det finns fler filer att # överväga: else: break for *_, file in heap: yield file for file in oldest_files("/path/to/search", 10 * 1024 * 1024): print(file)

Exempel i Python
Visa signatur

Abstractions all the way down.