Náhodné kopírování hudby do telefonu v Powershellu

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
}

 

Napsat komentář

Vaše emailová adresa nebude zveřejněna.