flexxa
Goto Top

Script: Dateien kopieren, Benamung anhand von Attributen

Hallo,

Windows10 liefert von Zeit zu Zeit sehr schöne Lock-Screen-Wallpapers aus. Diese werden hier abgelegt, ohne Dateiendung.

C:\Users\%USERNAME%\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\

Den ein oder anderen Wallpaper würde ich mir gerne abspeichern. Dazu soll der gesamte Inhalt aus dem oben genannten Pfad kopiert und unter "C:\temp" abgelegt werden. Da der Dateiname recht kryptisch ist (7e31cda0a286ebaaf06e2296b45da769117d445699d3e2b4fac6aa818b4d99b0), möchte ich während des Copyjobs (oder danach) die Dateien wie folgt benennen (die Dateidetails sind nach hinzufügen der Endung ".jpg" auslesbar).

Attribute: [DATE TAKEN] TITLE (DIMENSIONS)
Gewünschtes Ergebnis: [2013-12-08] The Quarry (1080 x 1920)

Abschließend sollen alle Bilder, die nicht der HD-Auflösung entsprechen, gelöscht werden.

Wer hat einen Lösungsansatz?

Content-Key: 310234

Url: https://administrator.de/contentid/310234

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: colinardo
Lösung colinardo 19.07.2016 aktualisiert um 14:55:57 Uhr
Goto Top
Hallo @reflexx,
mit Powershell z.B. so:

(Wenn ein Titel nicht vorhanden ist, nimmt das Skript als Titel die zufällige ID des Namens. Das Aufnahmedatum ist eine schlechte Wahl ich habe hier z.B. ein System dort ist das Aufnahmedatum nur bei 1 Datei vorhanden, bei den anderen nicht, deswegen habe ich mal der Einfachheit das Änderungsdatum der Datei genommen).
Zielpfad und die sprachlichen Unterschiede der Eigenschaften (Englisch/Deutsch) kannst du oben in den Variablen anpassen, im Moment ist es an ein deutsches System angepasst.
# Zielpfad der Bilder
$targetpath = 'C:\temp'  
# Eigenschaften je nach Sprache anpassen, Englisch: 'Title' und 'Dimensions' 
$title = 'Titel'  
$size = 'Abmessungen'  
# -----------------------------------

# Funktion liest erweiterete Dateieigenschaften aus
function Add-ExtendedFileProperties{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
        $fileItem,
        [String[]] $PropertyExtended = "ALL"  
    )
    begin
    {
        $shellObject = New-Object -Com Shell.Application
        $itemProperties = $null
    }

    process
    {
        if($fileItem.PsIsContainer)
        {
            $fileItem
            return
        }
        $directoryName = $fileItem.DirectoryName
        $filename = $fileItem.Name

        $folderObject = $shellObject.NameSpace($directoryName)
        $item = $folderObject.ParseName($filename)

        if(-not $itemProperties)
        {
            $itemProperties = @{}
            $counter = 0
            $columnName = ""  
            if ($PropertyExtended -eq "ALL"){  
                 #get all properties
                do {
                    $columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
                    if($columnName) { $itemProperties[$counter] = $columnName }
                    $counter++
                }while($columnName)
            }else{
                #get user defined properties
                do {
                    $columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
                    foreach($name in $PropertyExtended){
                        if ($columnName.toLower() -eq $name.toLower()){
                            $itemProperties[$counter] = $columnName
                        }
                    }
                    $counter++
                }while($columnName)
            }
        }

        foreach($itemProperty in $itemProperties.Keys)
        {
            $fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
                $folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
                SilentlyContinue
        }
        $fileItem
    }
}

# Funktion ersetzt ungültige Zeichen für Dateinamen
function Replace-IllegalPathChars([parameter(ValueFromPipeline=$true)]$string,$replaceString=''){  
   return ($string -replace '^com[1-9]|^lpt[1-9]|^con|^nul|^prn|[\\/:?<>|"*]',$replaceString)  
}
# kopieren, filtern und umbenennen
gci "$env:LOCALAPPDATA\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets" -File | copy-item -Destination {"$env:TEMP\$($_.Name).jpg"} -Force -PassThru | Add-ExtendedFileProperties -PropertyExtended "$size","$title" | ?{$_."$size" -match '1080 x 1920|1920 x 1080'} | Rename-Item -NewName {("$($_.LastWriteTime.Date.toString('yyyy-MM-dd'))_$(if($_."$title" -ne ''){$_."$title"}else{$_.Basename})_($($_."$size"))_$([System.IO.Path]::GetRandomFileName()).jpg" | Replace-IllegalPathChars)} -PassThru | move-item -Destination $targetpath -Force  
Grüße Uwe
Mitglied: Flexxa
Flexxa 20.07.2016 um 11:40:02 Uhr
Goto Top
Hallo Uwe,

Hut ab! Innerhalb kürzester Zeit zauberst Du hier ein PowerShell-Skript hin... face-smile

Beim Ausführen meldet es jedoch Fehler bei der Benamung.

Rename-Item : Cannot create a file when that file already exists.
At D:\%USERNAME%\MyProgramData\Windows\Scripts\CopyLockscreenPapers.ps1:75 char:299
+ ...  x 1080'} | Rename-Item -NewName {("$($_.LastWriteTime.Date.toString( ...  
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\XXXXXX...045c2175060.jpg:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Gruß
Mitglied: colinardo
Lösung colinardo 20.07.2016 aktualisiert um 13:40:32 Uhr
Goto Top
Dann war da doch tatsächlich eine Datei mit gleichem Datum, gleichem Titel und selber Auflösung, oder du hast die Variablen oben nicht an die Sprache angepasst. Dann müssen wir hier noch ein zusätzliches Random-Element im Dateinamen aufnehmen... Oben ergänzt.
Mitglied: Flexxa
Flexxa 20.07.2016 um 14:45:19 Uhr
Goto Top
Top! Macht was es soll. Ich danke dir für deine kompetente Entwicklung ;)