locked
Problem mit Skript beim Zusammenfügen von ts Dateien RRS feed

  • Frage

  • Hallo,

    mir wurde vo einem netten Forummitglied folgendes Skript geschrieben um mehrere Teildateinen einer großen .ts Filmdatei zusammenzufügen.

    Die Dateien wurden wegen FAT32 vom TV Revciever in mehrere Teile aufgeteilt. Alle in Ordnern in denen sich folgendes befindet (Filmname.ts; Filmname1.ts; Filmname2.ts etc.)

    # Quellverzeichnis mit Ordnern
    >> $Quelle = "N:\"
    >>
    >> # Zielverzeichnis der .ts Ausgabedatei(en)
    >> $Ziel = "S:\ZielOrdner"
    >>
    >> # falls "\" am Ende von Ziel vergessen
    >> if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }
    >>
    >> # falls Zielverzeichnis existiert
    >> if ( Test-Path -Path $Ziel -PathType Container ) {
    >>
    >>     # Einlesen der Verzeichnisse im Quellordner
    >>     $folders = Get-ChildItem -Directory -Path $Quelle
    >>
    >>     # falls Ordner vorhanden
    >>     if ( $folders.Count -ne 0 ) {
    >>         foreach ( $ordner in $folders ) {
    >>             # Kontrollausgabe
    >>             $ordner.FullName
    >>             # Name der Zieldatei
    >>             $Stub = $Ziel + $ordner.BaseName
    >>             # neue Datei
    >>             $target = $Stub + ".ts"
    >>             # bei Leerzeichen Anfuehrungszeichen hinzu
    >>             if ( $Stub.IndexOf(" ") -ne -1 ) { $target = "`"" + $target + "`"" }
    >>             # Suchmaske fuer Dateien im Ordner
    >>             $files = $ordner.FullName + "\*.ts"
    >>
    >>             # falls weder Zieldatei noch getestete Zieldatei vorhanden sind...
    >>             if ( -not ( Test-Path -Path $target ) ) {
    >>                 # bei Leerzeichen Anfuehrungszeichen hinzu wg. DOS
    >>                 if ( $files.IndexOf(" ") -ne -1 ) { $files = "`"" + $files + "`"" }
    >>                 # Combine per DOS-copy anwerfen
    >>                 Start-Process -FilePath "$env:comspec" -ArgumentList "/c","copy","/b",$files,$target -Wait
    >>                 # nach jedem Verzeichnis auf Enter-Taste warten
    >> #                Read-Host -Prompt "Enter..."
    >>             }
    >>         }
    >>     } else { Write-Host "Keine Ordner in $Quelle gefunden." }
    >> } else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }

    Das ganze funktionierte letzte Woche auch ganz gut.

    Als ich es heute gestartet habe wurden die Dateien in in der falschen Reihenfolge zusammengefügt.

    Also erst Teil3 danarn Teil2 daran Teil1 etc.

    Das macht natürlich keinen Sinn.

    Kann mir bitte jemand weiterhelfen und erklären wo das Problem liegt.

    Warum ging das letzte Woche und geht jetzt nicht mehr?

    Der einzige Unterschied waren die Quelle (I:\) und das Ziel. (P:\ZielOrdner)

    Ich bin hier echt am verzweifeln da ich riesige Mengen dieser Dateien hier habe.

    Bitte um Hilfe.

    Vielen Dank.

    Beste Grüße

    Ingo

    Freitag, 22. Mai 2020 14:13

Antworten

  • Weil Du "copy" keine strukturierte Dateiliste übergibst als Quelle, sondern nur das hier:
          $files = $ordner.FullName + "\*.ts"

    Was copy dann daraus macht, weiß nur der Programmierer. Wenn Du das steuern willst, mußt Du die Dateiliste manuell zusammenbauen - siehe "copy /?".


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Freitag, 22. Mai 2020 14:46
  • Was immer diese Logs sind, die kommen in Deinem ersten Beispiel nicht vor.

    Dateien in einem Ordner alphabetisch anordnen geht mit so etwas wie

    $folder = "c:\temp"
    $list = Get-ChildItem $folder | Sort-Object Name | Select-Object -ExpandProperty FullName
    "`"$($list -join '","')`""


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 13:25

Alle Antworten

  • Weil Du "copy" keine strukturierte Dateiliste übergibst als Quelle, sondern nur das hier:
          $files = $ordner.FullName + "\*.ts"

    Was copy dann daraus macht, weiß nur der Programmierer. Wenn Du das steuern willst, mußt Du die Dateiliste manuell zusammenbauen - siehe "copy /?".


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Freitag, 22. Mai 2020 14:46
  • ...und bitte, bitte, bitte benutze den Code-Editor (2. Button von rechts), um Code zu posten!

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 22. Mai 2020 16:15
  • Hallo LEDZEPPELIN13 und willkommen im Deutschen Microsoft Windows Powershell Forum.

    Wenn Du die gleiche Frage zur gleichen Zeit in mehreren unterschiedlichen Foren postest, sei doch bitte so fair und füge wenigstens Links zu den jeweils anderen Foren zu Deiner Frage. Damit sich die Leute, die bereit sind, Dir zu helfen, im Zweifel nicht mehrfach oder umsonst die Mühe machen müssen. 

    https://www.mcseboard.de/topic/218078-problem-mit-skript-beim-zusammenf%C3%BCgen-von-ts-dateien/

    ... und wie Evgenij schon erwähnt hat ... bitte Code als Code formatieren. How to Use the Code Feature in a TechNet Forum Post

    danke schon mal im Voraus.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 22. Mai 2020 16:33
  • # Quellverzeichnis mit Ordnern
    $Quelle = "I:\"
    
    # Zielverzeichnis der .ts Ausgabedatei(en)
    $Ziel = "J:\ZielOrdner"
    
    # falls "\" am Ende von Ziel vergessen
    if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }
    
    # falls Zielverzeichnis existiert
    if ( Test-Path -Path $Ziel -PathType Container ) {
    
        # Einlesen der Verzeichnisse im Quellordner
        $folders = Get-ChildItem -Directory -Path $Quelle
    
        # falls Ordner vorhanden
        if ( $folders.Count -ne 0 ) {
            foreach ( $ordner in $folders ) {
                # Kontrollausgabe
                $ordner.FullName
                # Name der Zieldatei
                $Stub = $Ziel + $ordner.BaseName
                # neue Datei
                $target = $Stub + ".ts"
                # bei Leerzeichen Anfuehrungszeichen hinzu
                if ( $Stub.IndexOf(" ") -ne -1 ) { $target = "`"" + $target + "`"" }
                # Suchmaske fuer Dateien im Ordner
                $files = $ordner.FullName + "\*.ts"
    
                # falls weder Zieldatei noch getestete Zieldatei vorhanden sind...
                if ( -not ( Test-Path -Path $target ) ) {
                    # bei Leerzeichen Anfuehrungszeichen hinzu wg. DOS
                    if ( $files.IndexOf(" ") -ne -1 ) { $files = "`"" + $files + "`"" }
                    # Combine per DOS-copy anwerfen
                    Start-Process -FilePath "$env:comspec" -ArgumentList "/c","copy","/b",$files,$target -Wait
                    # nach jedem Verzeichnis auf Enter-Taste warten
    #                Read-Host -Prompt "Enter..."
                }
            }
        } else { Write-Host "Keine Ordner in $Quelle gefunden." }
    } else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }

    Das ist der Originalcode der schon mal funktioniert hat. Deiner Anwesiung folgend hier der Hinweis das ich in zwei Foren die gleiche Frage gepostet habe.

    Einen Link darf ich noch nicht einfügen, steht aber im Post darüber.

    Freitag, 22. Mai 2020 18:50
  • "Was copy dann daraus macht, weiß nur der Programmierer. Wenn Du das steuern willst, mußt Du die Dateiliste manuell zusammenbauen - siehe "copy /?"."

    Aber genau das ist ja das was ich nicht will. Wenn ich die Dateien manuell angeben muss kann ich sie auch mit einem Programm zusammenfügen lassen. Bei Allen die ich kenne muss ich sie manuell auswählen, was eben sehr viel Zeit in Anspruch nehmen würde bei so vielen Dateien. Wir sprechen hier von mehreren hundert Filmen die sich seit 11 Jahren angesammelt haben.

    Deshalb hat mit der User netterweise dieses Skript geschrieben um mir Zeit zu sparen. Hat auch funktioniert. Jetzt geht es ja irgendwie auch noch. Eben nur in der falschen Reihenfolge. Keine Ahnung warum das plötzlich so ist.


    Freitag, 22. Mai 2020 18:58
  • Moin,

    was Martin meint ist nicht, dass Du konkrete Dateinamen hintereinander schreiben sollst, sondern, dass Du in PowerShell programmatisch die Dateien in richtiger Reihenfolge zusammensuchst und deren Liste dann an copy übergibst. Was Du im Moment machst, ist ja lediglich, copy zu sagen, wie das Muster für die Suche aussieht, aber nicht, in welcher Reihenfolge das Ergebnis der Suche zu verarbeiten ist. Ich würde mal vermuten, dass COPY auf irgendeine Umgebungsvariable schaut (so wie DIRCMD für dir), die bei Dir verändert wurde, daher die falsche Sortierreihenfolge.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 22. Mai 2020 19:16
  • Das klingt logisch.

    Aber wo genau liegt jetzt der Fehler wenn es schon mal funktioniert hat? War das nur Zufall?

    Und was muss geändert werden um das Problem zu lösen?

    Was muss man copy genau mitteilen und wie sieht so ein Skript aus?

    Freitag, 22. Mai 2020 19:53
  • Wie wäre diese Zeile?

    Bringt mich das der Lösung näher?

    Get-Content (gci log_* | sort BaseName) > gesamt.log

    Samstag, 23. Mai 2020 12:52
  • Was immer diese Logs sind, die kommen in Deinem ersten Beispiel nicht vor.

    Dateien in einem Ordner alphabetisch anordnen geht mit so etwas wie

    $folder = "c:\temp"
    $list = Get-ChildItem $folder | Sort-Object Name | Select-Object -ExpandProperty FullName
    "`"$($list -join '","')`""


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 13:25
  • Da ich keine Ahnung von der Materie habe versuche ich mich gerade einzulesen und war der Meinung das ich copy eben erst mal mitteilen muss wie die Reihenfolge ist. Das könnte über gci gehen dachte ich. Vielen Dank für Deine Zeile, aber ich will ja nix in einem Ordner sortieren, sondern copy mitteilen in welcher Reihenfolge die Dateien im Ordner zusammengefügt werden müssen. Das hat mit obigem Skript auch schon wunderbar funktioniert. Seit gestern fügt es die Dateien nur leider in der falschen Reihenfolge zusammen. Warum auch immer.
    Samstag, 23. Mai 2020 13:38
  • Da ich keine Ahnung von der Materie habe versuche ich mich gerade einzulesen und war der Meinung das ich copy eben erst mal mitteilen muss wie die Reihenfolge ist. Das könnte über gci gehen dachte ich. Vielen Dank für Deine Zeile, aber ich will ja nix in einem Ordner sortieren, sondern copy mitteilen in welcher Reihenfolge die Dateien im Ordner zusammengefügt werden müssen.

    Die Zeile, die Du ja scheinbar nicht ausgeführt hast, liefert einfach eine mit Komma verkettete Liste mit Dateipfaden aus dem Ordern, nach Name alphabetisch sortiert.

    Über "gci" bekommst Du eine Liste von Objekten (mit denen copy als DOS-Befehl schon mal nix anfangen kann), deren Sortierung nicht von Dir verbindlich festgelegt, sondern mit Umgebungsvariablen gesteuert ist, so wie mit copy auch.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 13:44
  • Genau. Ich bekomme eine Liste mit den Ordnern im Verzeichnis. Alphabetisch sortiert. Da die Dateien in den Ordnern liegen müßte ich sie jetzt alle einzeln angeben damit sie dann an copy übergeben werden?

    Samstag, 23. Mai 2020 14:43
  • Genau. Ich bekomme eine Liste mit den Ordnern im Verzeichnis. Alphabetisch sortiert. Da die Dateien in den Ordnern liegen müßte ich sie jetzt alle einzeln angeben damit sie dann an copy übergeben werden?

    Nein

    Wenn Du nicht begreifst, dass Du einfach eine Ordnerebene tiefer gehen musst, kann ich Dir nicht helfen, sorry.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 15:02
  • Das ist mir schon klar.

    Ich habe aber keine Ahnung wie ich das formulieren muss und wo im Skript einfügen.

    Noch ein Hinweis, es scheint von der HDD abzuhängen. Obwohl die Daten auf beiden Platten gleich gespeichert sind kann ich mit dem Skript von einer Platte normal zusammenfügen und von der anderen nur in der falschen Reihenfolge.

    Samstag, 23. Mai 2020 19:14
  • Ich habe aber keine Ahnung wie ich das formulieren muss und wo im Skript einfügen.

    Wie ich Dir schon im anderen Forum geschrieben habe: Dir fehlen die Grundlagen.  Es ist deutlich außerhalb der Möglichkeiten eines Forums, Dir die Grundlagen einer komplexen Technologie zu vermitteln. Du wirst Dir, auch um die Hilfen zu verstehen, die Du in Foren wie diesem erhältst, ein Grundverständnis von Powershell aneignen müssen. Zwei Links zum Starten habe ich Dir im anderen Forum gepostet.

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 23. Mai 2020 19:21
  • Das ist mir schon klar.

    Ich habe aber keine Ahnung wie ich das formulieren muss und wo im Skript einfügen.

    Noch ein Hinweis, es scheint von der HDD abzuhängen. Obwohl die Daten auf beiden Platten gleich gespeichert sind kann ich mit dem Skript von einer Platte normal zusammenfügen und von der anderen nur in der falschen Reihenfolge.

    Dass es von der Umgebung abhängt, schreibe ich Dir schon die ganze Zeit. Schau Dir mal die Zeitstempel der Dateien an, vielleicht erkennst Du da ein Muster.

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 19:31
  • Danke.

    Dafür fehlt mir die Zeit.

    Bis ich das alles verstehe um mein Problem selber zu lösen kann ich die Dateien auch manuelle zusammenfügen.

    Das dauert auch nicht länger.

    Ich dachte es wäre ein leicht zu lösendes Problem bei dem mir Experten wie ihr helfen können.

    Das Problem ist wohl leider nicht so leicht zu beheben.

    Ich kenne es aus meiner Profession nicht so, dass ich Fragenden erst mal Literatur oder Links in de Hand drücke damit sie sich selber um ihr Problem kümmern.

    Aber gut.

    Vielen Dank für die Tipps und Hinweise. Vielleicht finde ich mal die Zeit mir das alles anzuschauen.

    Samstag, 23. Mai 2020 19:32

  • Ich kenne es aus meiner Profession nicht so, dass ich Fragenden erst mal Literatur oder Links in de Hand drücke damit sie sich selber um ihr Problem kümmern.

    Die Profession hat nichts damit zu tun. Dieses Forum hier ist vom Betreiber genau so definiert: Hilfe zu Selbsthilfe. Irgendwo in den Forenregeln ist es sogar beschrieben.

    Ich bin mir sicher, irgendwo in den unendlichen Weiten des Internet gibt es auch eine Plattform, wo Wissende in ihrer Freizeit kostenlos Deine Probleme ferndiagnostizieren und abschließend verlässlich lösen.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Samstag, 23. Mai 2020 19:51
  • Auf das Niveau begebe ich mich nicht.

    Samstag, 23. Mai 2020 21:17