Batch Datei automatisiert befüllen?

Begonnen von Trimonium, Januar 03, 2020, 11:23:56

« vorheriges - nächstes »

Mam

Zitat von: LED ZEPPELIN am Mai 13, 2020, 10:17:26
Vielen Dank.
Ich habe jetzt folgendes gemacht.
PS im Ordner geöffnet und
PS I:\Der große Gatsby> cmd /c copy /b Der große Gatsby.TS+Der große Gatsby1.TS+Der große Gatsby2.TS
eingegeben.
Ergebnis:
Das System kann die angegebene Datei nicht finden.

Ich verzweifel hier langsam.

Never give up!  ;D

Das konnte mal wieder nicht klappen, weil die Dateinamen Leerzeichen enthalten. Du musst sie dann immer in Anführungszeichen packen:

cmd /c copy /b "Der große Gatsby.TS"+"Der große Gatsby1.TS"+"Der große Gatsby2.TS" <HIER FEHLT NOCH DIE ZIELDATEI!!!>

Ausserdem hast Du am Ende vergessen, einen Pfad/Namen für die Zieldatei anzugeben!

(Aber, wie schon hier erwähnt, wozu brauchst Du das eigentlich? Der Doc fügt die Dateien automatisch zusammen...)

LED ZEPPELIN

Werde ich später mal testen.
Deine Frage ist berechtigt.

Ich suche nach einer Möglichkeit die Dateien automatisiert zusammenzufügen um sie dann mit deinem Skript abarbeiten zu können.

Dabei bin ich über die Zeile oben gestolpert und wollte es mal versuchen.

Problem ist natürlich, dass ich so immer alles manuell eingeben muss.
Da hast Du recht, das kann ich dann auch gleich über den Doc machen.

Aber ich hoffe immernoch auf ein PS Skript mit dem ich alle Ordner auslesen und die Dateien zusammenfügen kann.

tsduser

Versuch's mal damit:
# 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!" }


Danach musst Du dann das andere Script ueber das Zielverzeichnis laufen lassen.

Das Script verwendet ein paar Vermutungen aus Deinen bisher getaetigten Aeusserungen; auf die gestellten Fragen gehst Du ja nur minimal bis gar nicht ein ;-)

LED ZEPPELIN

Warum.
Welche Frage habe ich nicht beantwortet?
War keine Absicht.
Liegt wohl an meiner zunehmenden Verwirrung durch zu viel Programmiersprachenstudium.

LED ZEPPELIN

Habs mal laufen lassen.
Nur das Zielverzeichnis angelegt und den Pfad entsprechend angepasst.
Hier das Ergebnis.
PS C:\Users\ICH> # Quellverzeichnis mit Ordnern
>> >> $Quelle = "I:\"
>> >>
>> >> # Zielverzeichnis der .ts Ausgabedatei(en)
>> >> $Ziel = "P:\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!" }
In Zeile:18 Zeichen:30
+ >>         foreach ( $ordner in $folders ) {
+                              ~~
Unerwartetes Token "in" in Ausdruck oder Anweisung.
In Zeile:18 Zeichen:29
+ >>         foreach ( $ordner in $folders ) {
+                             ~
Schließende ")" fehlt in einem Ausdruck.
In Zeile:17 Zeichen:36
+ >>     if ( $folders.Count -ne 0 ) {
+                                    ~
Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
In Zeile:11 Zeichen:53
+ >> if ( Test-Path -Path $Ziel -PathType Container ) {
+                                                     ~
Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
In Zeile:18 Zeichen:42
+ >>         foreach ( $ordner in $folders ) {
+                                          ~
Unerwartetes Token ")" in Ausdruck oder Anweisung.
In Zeile:40 Zeichen:8
+ >>     } else { Write-Host "Keine Ordner in $Quelle gefunden." }
+        ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.
In Zeile:41 Zeichen:4
+ >> } else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }
+    ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

PS C:\Users\ICH> # Quellverzeichnis mit Ordnern
PS C:\Users\ICH> >> $Quelle = "I:\"
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> $Quelle = "I:\"
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >>
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >>
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> # Zielverzeichnis der .ts Ausgabedatei(en)
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> # Zielverzeichnis der .ts Ausgabedatei(en)
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> $Ziel = "P:\ZielOrdner"
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> $Ziel = "P:\ZielOrdner"
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >>
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >>
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> # falls "\" am Ende von Ziel vergessen
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> # falls "\" am Ende von Ziel vergessen
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >>
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >>
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> # falls Zielverzeichnis existiert
>> : Die Benennung ">>" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ >> # falls Zielverzeichnis existiert
+ ~~
    + CategoryInfo          : ObjectNotFound: (>>:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\ICH> >> 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..."
>> >>             }
>> >>         }
In Zeile:8 Zeichen:30
+ >>         foreach ( $ordner in $folders ) {
+                              ~~
Unerwartetes Token "in" in Ausdruck oder Anweisung.
In Zeile:8 Zeichen:29
+ >>         foreach ( $ordner in $folders ) {
+                             ~
Schließende ")" fehlt in einem Ausdruck.
In Zeile:7 Zeichen:36
+ >>     if ( $folders.Count -ne 0 ) {
+                                    ~
Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
In Zeile:1 Zeichen:53
+ >> if ( Test-Path -Path $Ziel -PathType Container ) {
+                                                     ~
Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
In Zeile:8 Zeichen:42
+ >>         foreach ( $ordner in $folders ) {
+                                          ~
Unerwartetes Token ")" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

PS C:\Users\ICH> >>     } else { Write-Host "Keine Ordner in $Quelle gefunden." }
In Zeile:1 Zeichen:8
+ >>     } else { Write-Host "Keine Ordner in $Quelle gefunden." }
+        ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

PS C:\Users\ICH> >> } else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }

tsduser

Nein, Du hast es nicht laufenlassen, sondern einfach mal auf den PoSh-Prompt kopiert, denke ich :-)

Bitte das Script speichern als irgendwas.ps1 (so wie das andere Script auch), und dann das irgendwas.ps1 in der PoSh ausfuehren.

Mit den unbeantworteten Fragen beziehe mich auf das Directory-Listing, den weggelassenen Zieldateinamen, ...

LED ZEPPELIN

Richtig.
Das habe ich noch nicht beantwortet.
Ich versuch jetzt erst mal das umzusetzen was Du gerade geschrieben hast.

Mam

lol  ;D
So langsam wird es etwas unübersichtlich  8)

Gemäß dem Motto: "wo ich bin herrscht Chaos!   :P" (aber, ich kann nicht überall gleichzeitig sein  :-* )

LED ZEPPELIN

Ach kommt Leute so viel Chaos verbreite ich auch wieder nicht.
Ich versuch hier Home Office Multitasking mit Home Schooling und habe null Ahnung von Programmierung.
Habe halt was einfaches studiert und nix so komplexes wie ihr hier.

Jetzt mal der Reihe nach.
Das Skript von Mam habe ich jetzt zum laufen gebracht und das neue Skript von tsduser funktioniert auch perfekt.
Es kommt wohl auf die PS Version an in die man es kopiert.
Speichern lies es sich über PS aber nicht.

Vielen Vielen Dank Euch beiden.

Kann ich mich irgendwie erkenntlich zeigen?

tsduser

Nein, alles kein Problem.  :D

Wenn Du hier durch die Threads schaust, stellst Du sicher fest, dass der Ton hier im Forum an einigen Stellen schon rauher ist als anderswo in der Forenwelt... (vielleicht auch weniger rauh, aber solche Foren kenne ICH dann nicht).

Aber zumindest fuer mich ist das Feedback, dass alles jetzt wie gewuenscht laeuft, Belohnung genug. Auch dies ist bereits mehr, als man von etlichen anderen bekommt.

LED ZEPPELIN

Zwei Frage hätte ich noch:
Wie muss ich das Skript anpassen damit auch TS4 Dateien zusammengefügt werden?
Und können diese dann auch als TS ausgegeben werden oder nur als TS4?

Habe noch sehr viel altes TS4 Material von meinem Technisat HDS 2+ hier auf den HDDs wie ich gerade feststellen mußte.

LED ZEPPELIN

#41
So rauh geht es hier auch nicht zu.
Aber sicher etwas derber als in anderen Foren, das ist richtig.
Wer das nicht abkann sollte halt nicht posten.
Mir war das schon vorher klar da ich fast alles Postings zu den Themen Batchdatei und Commandline gelesen habe.
Bin ehrlich gesagt davon ausgegangen dass ich hier wegen meiner Blödheit in Bezug auf cmd und PS deutlich angegangen werde.

tsduser

Na, dann gehe ich mal vorsichtig davon aus, dass das kein Flehen eines Masochisten nach haerterer Bestrafung ist  :)
Sonst wuerde ich den Sadisten raushaengen lassen, und diese Bestrafung verweigern  ;D

Im Script muesstest Du nur in den Zeilen 24 und 28 ".ts" nach ".ts4" aendern.

Ob die Zieldateien wirklich verwendbar sind, kannst Du ja vorab testen auf einer Eingabeaufforderung (nicht in der PowerShell) mit copy /b "I:\Quellordner\Datei1.ts4" + "I:\Quellordner\Datei2.ts4" "P:\Zielordner\Zieldatei.ts4"
...und durch Sichtkontrolle der Zieldatei (insbesondere der Nahtstelle) in Deinem Wiedergabegeraet.

Alle weiteren, eigentlich notwendigen Details zu Containerformaten, Countern, Timern, usw. wuerden jetzt den Rahmen dieses ja sowieso gekaperten Threads nur sprengen, fuerchte ich.

LED ZEPPELIN

Danke.
Test läuft. Ich lasse auch gleich als ".ts" ausgeben.
Melde mich später mit dem Ergebnis.
Muss jetzt weg.

Dann doch noch was:
Wie kann ich der Zeile beibringen, dass sie auch die Unterordner durchsucht?
TSDoctor.exe E:\*.ts Autofix D:\

tsduser

Zitat von: LED ZEPPELINWie kann ich der Zeile beibringen, dass sie auch die Unterordner durchsucht?
TSDoctor.exe E:\*.ts Autofix D:\
Durch lautstarkes Betteln beim "Cheffe" Cypheros, oder durch den Einwurf groesserer Mengen kleinerer Muenzen an derselben Stelle, denn hier kuemmert sich das aufgerufene Programm (TSDoctor.exe) um das Einsammeln der auf das Suchmuster (E:\*.ts) passenden Eingabedateien.

Ansonsten findet sich eine Loesung dieser Frage doch in dem Script, das Mam hier postete, und ueber das Ihr Euch bereits austauschtet...


www.cypheros.de