PowerShell: Dateien mischen

Guten Tag,% habrauser%!
Kürzlich haben sie mir eine auf den ersten Blick recht einfache Aufgabe gestellt: Wir müssen etwa 1000 Fotos für das Abstimmungssystem mischen.
Manuell ist dies eine undankbare Aufgabe. Benötigen Sie ein nettes kleines Skript.
PowerShell stellte sich als ideale Option heraus: Ich wollte nicht so etwas wie Python installieren, aber ich habe mich in meinem Leben noch nie mit .bat-Dateien angefreundet.

Fangen wir an.
Die Namen der Fotos waren wichtig und ich wollte sie behalten. Ich habe beschlossen, sie in den Dateieigenschaften zu entfernen ("Zusammenfassung" für WinXp, "Details" für Win7). Außerdem wird die Abstimmung auf Sharepoint geschrieben, und er kann den "Namen" aus den Dateieigenschaften abrufen. Es stellte sich als sehr praktisch heraus.
Die Komponente wurde zum Bearbeiten der Dateieigenschaften verwendet.OLE File Property Reader 2.1 (Es gibt einen Library Wrapper für .net im Ordner "vb7 examples"), der Vorteil wurde bereits auf dem Computer installiert. Die Komponente ist für Office-Dokumente, aber auch für Bilder gedacht.

Das eigentliche Drehbuch:
[System.Reflection.Assembly]::LoadFrom('c:\DsoFile\Source\Vb7Demo\bin\Interop.DSOFile.dll')
function SetSummary-Name([string] $folder, [string]$pattern = '*.*')
{
    $files = [System.IO.Directory]::GetFiles($folder, $pattern)
    foreach ($f in $files)
    {
        $oled = New-Object -TypeName DSOFile.OleDocumentPropertiesClass
        $oled.Open($f, $false, [DSOFile.dsoFileOpenOptions]::dsoOptionDefault)
        $sp =  $oled.SummaryProperties
        $sp.Title = $f.Substring($f.lastindexof('\') + 1, $f.lastindexof('.') - $f.lastindexof('\') - 1)
        $oled.close($true)
    }
}
SetSummary-Name -folder 'c:\photo'


Als nächstes gehen wir zum Mischen über:
Es war möglich, numerische Namen zu generieren, aber plötzlich wollte ich wirklich ein Fahrrad mit komplexem Design erfinden.

# Заменяет имя файла на произвольный набор букв
function RandomName([string]$path)
{
    $length = 20 # длинна нового имени
    $sb = New-Object -TypeName System.Text.StringBuilder
    for($i=0; $i -lt $length; $i++)
    {
        # Тут меня отпустило, велосипед удался...
        [char]$ch = [Convert]::ToChar([Convert]::ToInt32([Math]::Floor(26 * $rand.NextDouble() + 65)))
        $tmp = $sb.Append($ch) # Append возвращает ненужную нам информацию, выкидываем ее в $tmp
    }
    $name = $path.Substring($path.lastindexof('\') + 1, $path.lastindexof('.') - $path.lastindexof('\') - 1)
    $sb = $sb.ToString().ToLower()
    return $path.Replace($name, $sb)
}
function MixFiles([string]$From, [string]$pattern = '*.*')
{
    $files = [System.IO.Directory]::GetFiles($from, $pattern)
    foreach($f in $files)
    {
        $path = RandomName -path $f
        # На всякий случай проверим, 
        while([System.IO.File]::Exists($path))
        {
            # Чтобы знать, если такое случится
            $path
            $path = RandomName -path $f
        }
        # Для красоты покажем старые и новые имена
        Write-Host ($f +  ' -> ' + $path)
        [System.IO.File]::Move($f, $path)
    }
}
$rand = New-Object -TypeName Random
MixFiles -from 'c:\test\' -pattern '*.jpg'


Vielen Dank für Ihre Aufmerksamkeit, ich hoffe, ich werde jemandem nützlich sein.

Jetzt auch beliebt: