Hledal jsem software, který mi dokáže zkopírovat náhodná alba z disku do telefonu pro poslech. Našel jsem poměrně schopný Random Copy, ale hudbu mám uloženou ve formátu hudebník\album\písničky.* a s touto adresářovou strukturou si bohužel Random Copy neporadí, umí podadresáře jen do první úrovně. Tak jsem si vytvořil jednoduchý prográmek v Powershellu, který dělá to samé, ale pro mou adresářovou strukturu. Pro jinou nebude fungovat, ale půjde jednoduše upravit, pokud budete chtít.
Program se spouští s parametry .\randomcopy.ps1 zdrojová_složka cílová_složka velikost[MB]
Např.: .\randomcopy.ps1 „S:\Dokumenty\My Music\“ „E:\Hudba“ 10000
vybere náhodně alba ze složky S:\Dokumenty\My Music\ a zkopíruje je do E:\Hudba tak, aby byla celková velikost cca 10 GB.
Program se snaží dosáhnout zhruba požadované velikosti tak, aby byla zkopírovaná jen celá alba. Velikost může být o něco větší, i menší.
No a kód?
$startFolder=$args[0] $targetFolder=$args[1] $MaxSize=$args[2] * 1MB if ($MaxSize -eq $Null) { "Použití: randomAlbum.ps1 zdrojový_adresář cílový_adresář velikost[MB]" exit } $colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True}) $seznamAdresaru = New-Object System.Collections.ArrayList foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum -ErrorAction SilentlyContinue) if ($subFolderItems.sum -ne $Null) { $malepole = $i.FullName, ($subFolderItems.sum) $seznamAdresaru.add($malepole) | out-null } } $pocetAddr = $seznamAdresaru.Count "Zdrojový adresář: " + $startFolder "Cílový adresář: " + $targetFolder "Maximální velikost: " + $maxSize / 1MB "Počet adresářů: " + $pocetAddr echo "Počítám..." $celkovaVelikost = 0 $vybraneAdresare = @() while ($true) { $nahoda = Get-Random -minimum 0 -maximum $pocetAddr if ($celkovaVelikost + $seznamAdresaru[$nahoda][1] / 2 -lt $maxSize) { $vybraneAdresare += $seznamAdresaru[$nahoda][0] $celkovaVelikost += $seznamAdresaru[$nahoda][1] $seznamAdresaru.RemoveAt($nahoda) $pocetAddr-- if ($pocetAddr -eq 0) { "Zkopírovány všechny soubory, končím." break } } else { break } } "Celková velikost: " + "{0:N2}" -f ($celkovaVelikost / 1MB) + " MB" "Kopíruji adresáře: " foreach ($i in $vybraneAdresare) { echo $i $rodicAdresar = Split-Path $i | Split-Path -leaf $adresar = Split-Path $i -leaf Copy-Item $i "$targetFolder\$rodicAdresar\$adresar" -Recurse }