scoorpyn
Goto Top

Filmliste mit Namen und relativen Pfad als .txt erstellen mit Powershell

Hallo ich mache gerade ein Praktikum und habe noch nicht viel mit Powershell gearbeitet.
Ich habe mich schon ein wenig reingelesen und einige kleinere Spielereien damit gemacht.
Mein Problem ist wie folgt ich soll eine Filmliste von einem bestimmten Pfad aus dem Netzwerk in eine .txt Datei erstellen.
In dieser Liste soll der Name des Films und der relative Pfad angezeigt werden, dazu kommt das in diesem Pfad noch ein weiterer Ordner ist der ebenfalls Filme enthält und diese auch in die Liste eingetragen werden müssen.
Könntet ihr mir vielleicht ein paar Hilfe Stellungen geben? Oder sogar noch Literatur empfehlen wo ich sowas nachlesen könnte?

Content-Key: 222582

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

Printed on: April 23, 2024 at 07:04 o'clock

Member: colinardo
colinardo Nov 21, 2013, updated at Nov 22, 2013 at 16:50:17 (UTC)
Goto Top
Hallo Scoorpyn, Willkommen im Forum!
kein Problem, wenn die Ausgabe der Pfade relativ zum Startordner ausgegeben werden sollen kannst du dies so machen. Es werden alle Dateien in allen Unterordnern rekursiv verarbeitet.
(Zeile 1 = Startordner / Zeile 2 = Pfad zur Ausgabedatei)
$startDir = "\\Server\freigabe"  
$filmliste = "C:\filmliste.txt"  
Get-ChildItem $startDir -Recurse -File | select Name,@{Name="Relativer Pfad";e={$_.DirectoryName.Replace($startDir,"")}} | out-file $filmliste -Encoding UTF8  
möchtest du die Liste lieber als *.csv-Datei haben kannst du das out-file .... am Ende durch
export-csv $filmliste -Delimiter ";" -NoTypeInformation -Encoding UTF8
ersetzen.

Gute Fundstellen zum lernen von Powershell sind z.B. diese

Grüße Uwe
Member: Scoorpyn
Scoorpyn Nov 21, 2013 updated at 08:18:53 (UTC)
Goto Top
Wow vielen lieben Dank colinardo da werde ich einiges zu lesen haben ^^
Ich werde das gleich mal testen face-smile

Mir fällt da gerade ein kann man das auch mit Get-ChildItem machen statt Dir?
Member: colinardo
colinardo Nov 22, 2013 updated at 16:51:39 (UTC)
Goto Top
Zitat von @Scoorpyn:
Mir fällt da gerade ein kann man das auch mit Get-ChildItem machen statt Dir?
klar ...kannst du auch nehmen, s.o.
Member: Scoorpyn
Scoorpyn Nov 27, 2013 updated at 08:36:30 (UTC)
Goto Top
Eine letzte Frage noch, wenn ich nun die Liste erweitern will und zwar mit der Bildhöhe und der Bildbreite der Filme wie könnte ich es dann schreiben? Sry falls das eine nervige Frage ist face-sad
Achja irgendwie scheine ich da einen Fehler noch zu haben mein Powershell erkennt den Befehl -file nicht.

Außerdem wie könnte ich bei der Ausgabe noch einen . vor den \ der relativen Pfade ausgeben ohne dann auch einen . bei den Dateien zu haben wo ich keinen relativen Pfad habe?
Member: colinardo
colinardo Nov 27, 2013 updated at 10:25:05 (UTC)
Goto Top
Zitat von @Scoorpyn:
Eine letzte Frage noch, wenn ich nun die Liste erweitern will und zwar mit der Bildhöhe und der Bildbreite der Filme wie
könnte ich es dann schreiben?
Das geht ...
function Add-ExtendedFileProperties{
 <#
     .SYNOPSIS
        Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu
     .DESCRIPTION
        Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
     .EXAMPLE 
            Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite","Bitrate" | ft Name,Bildhöhe,Bildbreite,Bitrate  
            Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Bitrate" als zusätzliche Spalten dem Objekt in der Pipline hinzu  
     .EXAMPLE
            Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *  
            Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline hinzu
     .PARAMETER PropertyExtended
        Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
            -PropertyExtended "Bildhöhe","Bildbreite","Bitrate"  
#>
    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
    }
}

$startDir = "\\Server\Freigabe"  
$filmliste = "C:\filmliste.txt"  
Get-ChildItem $startDir -Recurse | ?{$_.PSIsContainer -eq $false} | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite" | select Name,@{Name="Relativer Pfad";e={$relDir = $_.DirectoryName.Replace($startDir,""); if ($relDir -ne ""){echo ".$relDir"}}},Bildhöhe,Bildbreite | out-file $filmliste -Encoding UTF8  
Achja irgendwie scheine ich da einen Fehler noch zu haben mein Powershell erkennt den Befehl -file nicht.
dann hast du noch eine ältere Version von Powershell. Siehe dazu das o. Script als Workaround.
Außerdem wie könnte ich bei der Ausgabe noch einen . vor den \ der relativen Pfade ausgeben ohne dann auch einen . bei den Dateien zu haben wo ich keinen relativen Pfad habe?
siehe Script oben

Grüße Uwe
Member: Scoorpyn
Scoorpyn Dec 02, 2013 at 09:32:52 (UTC)
Goto Top
Für was steht das @ in Zeile 43?
Ist das ein Alias für einen bestimmten Befehl?

Bisher habe ich nur gelesen, dass man mit dem @-Zeichen Variablen in ein System.Array zwingen kann.
Member: colinardo
colinardo Dec 02, 2013 updated at 09:34:58 (UTC)
Goto Top
Hallo scoorpyn,
$itemProperties = @{} 
dies erstellt eine neue Hashtable:

Grüße Uwe
Member: Scoorpyn
Scoorpyn Dec 02, 2013 at 12:31:58 (UTC)
Goto Top
Ok eine letzte Frage habe ich da noch kann ich diese Liste dann auch im Powershell Filmdateien mit der Endung .mov verwenden oder muss ich dafür MediaInfo nehmen und dann mit der Kommandozeile, die Liste erstellen lassen?
Member: colinardo
colinardo Dec 02, 2013 at 12:37:48 (UTC)
Goto Top
Zitat von @Scoorpyn:
Ok eine letzte Frage habe ich da noch kann ich diese Liste dann auch im Powershell Filmdateien mit der Endung .mov verwenden
Wenn du auf dem Tab "Details" der Dateieigenschaften bei den MOV-Dateien die Breite und Höhe sehen kannst wird es auch mit diesen Video-Dateien gehen. Ansonsten wirst du auf MediaInfo zurückgreifen müssen.

Grüße Uwe

p.s. wenn's das dann war, Beitrag bitte noch als gelöst markieren. Merci.