Batch Datei automatisiert befüllen?

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

« vorheriges - nächstes »

tsduser

@Mam:
Hast Du mal das "WSL" (Windows Subsystem for Linux, eine Ubuntu-VM in W10) ausprobiert? Das sollte auch irgendwas mit der Datei-Gross/Klein-Schreibung umstellen. Habe ich selber aber noch nie naeher betrachtet. Entweder nehme ich Cygwin, oder gleich eine eigene Linux-VM.
Und ich kann da leider nichts "einbauen und ausprobieren"; bei mir bekomme ich das Problem ja auch nicht nachgestellt...

Der Rest @LED ZEPPELIN:
Wir werden Dich hier schon noch zum Programmierer umfunktionieren  8)
Deine eigene Erweiterung fuer ts4/TS4 war schon mal voellig korrekt, IMHO.

Gehen wir die Sache doch mal (vergleichsweise) nachhaltig an.

Probiere bitte dieses Skript (aus Deinem juengsten Code-Post)
# Quellverzeichnis mit Ordnern
$Quelle = "B:\Rest"

# Zielverzeichnis der .ts Ausgabedatei(en)
$Ziel = "I:\Test"

# Logdatei zur Problemanalyse
$Log = "I:\Test\_Log.txt"

# 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 ) {
        $folders.FullName | Out-File -FilePath $Log -Append -Encoding utf8
        foreach ( $ordner in $folders ) {
            # Kontrollausgabe
            $ordner.FullName
            "Aktueller Ordner: " + $ordner.FullName | Out-File -FilePath $Log -Append -Encoding utf8
            # Name der Zieldatei
            $Stub = $Ziel + $ordner.BaseName
            # neue Datei
            $target = $Stub + ".ts"
            # bei Leerzeichen Anfuehrungszeichen hinzu
            $target = "`"" + $target + "`""
            "Zieldatei: " + $target | Out-File -FilePath $Log -Append -Encoding utf8
            # Suchmaske fuer Dateien im Ordner
            $filesL = $ordner.FullName + "\*.ts"
            $filesN = $ordner.FullName + "\*.ts4"
            $filesR = $ordner.FullName + "\*.TS4"
            $filesU = $ordner.FullName + "\*.TS"
     
            # nur falls Zieldatei nicht vorhanden ist...
            if ( -not ( Test-Path -Path $target ) ) {
                $dateienL = Get-ChildItem -File -Path $filesL
                $dateienN = Get-ChildItem -File -Path $filesN
                $dateienR = Get-ChildItem -File -Path $filesR
                $dateienU = Get-ChildItem -File -Path $filesU
                "DateienL: " | Out-File -FilePath $Log -Append -Encoding utf8
                Tee-Object -FilePath $Log -Append -InputObject $dateienL.FullName
                "DateienN: " | Out-File -FilePath $Log -Append -Encoding utf8
                Tee-Object -FilePath $Log -Append -InputObject $dateienN.FullName
                "DateienR: " | Out-File -FilePath $Log -Append -Encoding utf8
                Tee-Object -FilePath $Log -Append -InputObject $dateienR.FullName
                "DateienU: " | Out-File -FilePath $Log -Append -Encoding utf8
                Tee-Object -FilePath $Log -Append -InputObject $dateienU.FullName
                $dateien = $dateienL + $dateienN + $dateienR + $dateienU | Select-Object -Unique | Sort-Object -Property Name
                "Dateien: " | Out-File -FilePath $Log -Append -Encoding utf8
                Tee-Object -FilePath $Log -Append -InputObject $dateien.FullName
                if ( $dateien.Count -ne 0 ) {
                    $files = " `""+$dateien[0].FullName+"`""
                    "files1: " + $files | Out-File -FilePath $Log -Append -Encoding utf8
                    for ( $i = 1 ; $i -lt $dateien.Count ; $i++ ) { $files += " + `""+($dateien[$i].FullName)+"`" " }
                    "filesAlle: " + $files | Out-File -FilePath $Log -Append -Encoding utf8
                    # 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 .ts- oder .ts4-Dateien in >" $ordner.Fullname "< gefunden." ; "Keine Dateien im Ordner." | Out-File -FilePath $Log -Append -Encoding utf8 }
            }
        }
    } else { Write-Host "Keine Ordner in $Quelle gefunden." ; "$Quelle ohne Ordner." | Out-File -FilePath $Log -Append -Encoding utf8 }
} else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" ; "Ziel $Ziel nicht vorhanden." | Out-File -FilePath $Log -Append -Encoding utf8 }

und lade dann hier die vom Skript erstellte Datei "I:\Test\_Log.txt" hoch.
Diese Logdatei enthaelt (hofentlich...) etliche Informationen zu den Variableninhalten im Verlaufe der Skriptabarbeitung, und ich erwarte, dass das vielleicht ein wenig mehr Klarheit in die Sache bringt.

Bitte das Log nicht unbedingt als Text posten, sondern einfach die Datei als Anhang hochladen.
Und es waere vorteilhaft, wenn Du Deine Code-Postings auch nicht als Plain Text hier postest, sondern in einer "Code:"-Umgebung (das ist der Button mit dem Lattenzaun/Hashmark/"#" ueber dem Texteingabefeld hier). Weiteres Plus: Die "Code:"-Umgebung hat gleich ein "Auswählen" mit dran  ;)

Mam

Zitat von: tsduser am Juni 18, 2020, 18:58:11
@Mam:
Hast Du mal das "WSL" (Windows Subsystem for Linux, eine Ubuntu-VM in W10) ausprobiert? Das sollte auch irgendwas mit der Datei-
@tsduser: JEIN  ;D
Ubuntu ist DAS rote Tuch für mich, eindeutig die mieseste Distribution, die man sich antuen kann (Microsoft nimmt es deshalb vielleicht als Abschreckung ? )
Also WSL hat hier nicht wirklich lange überlebt  ;D

Aber, wenn ich mich recht besinne, auch da gabs keine G/K Unterscheidung, zumindest nicht, wenn man auf Windows Dateien zugreift.


Das das Skript bei ihm bei "nur eine TS-Datei vorhanden" "hängenbleibt" ist logisch.
Da kommt dann eine syntaktisch falsche "copy /b ..." Zeile raus und der cmd sieht sich genötigt, eine Fehlermeldung auszuspucken und auf Besserung zu warten.
Du must wohl noch gucken, ob wirklich MEHR als eine Datei da ist, und nur dann die Zusammenführung machen. Ansonsten nur ein normaler Copy, ohne "+ ..."

Aber insgesamt finde ich den ganzen Ansatz, mit "wir wechseln die komplette Betriebsumgebung, weil wir keinen Ersatz für Copy + finden" etwas traurig. Das muss auch "legal" gehen mit der PS, wir sind nur zu doof :-)


LED ZEPPELIN

Ich glaube da haben wir einen Denkfehler drin.
Von Quelle B Rest nach I hat es ja funktioniert.
Das Problem lag bei einer anderen HDD vor.

Um da ein log File zu bekommen muss ich das erst mal umschreiben und durchlaufen lassen.

Ich lade es dann hoch wenn es fertig ist.

tsduser

Bei nur einer gefundenen Datei wird $files VOR der for-Schleife mit dem Quelldateinamen belegt, und die ab dem zweiten Element (Index [1], das ja nicht vorhanden ist) zu durchlaufende Schleife wird erst gar nicht gestartet mit ihren Plus-Zeichen.
Eigentlich sollte das Skript deshalb nicht haengenbleiben, und der copy-Aufruf trotzdem syntaktisch richtig sein.

Aber gerade sehe ich, dass die Addition von den 1-objektigen Dateien dateienL, dateienU usw. nicht funktioniert; das klappt nur bei mehr-objektigen...
Muss ich mal schnell drumrum basteln, also lohnt ein Durchlauf jetzt noch nicht.
Und JA: Den Namen und das Verzeichnis der Logdatei musst Du ebenso anpassen wie Quell- und Ziel-Ordner.

Trotzdem bin ich gespannt auf die Logdatei. Spaeter...

Ich hatte mir auch erst gedacht, dass da doch ein binaeres Kopieren in der PoSh geht, aber die Fundstellen im Web haben einhellig berichtet, dass die Variante mit copy /b auf der Eingabeaufforderung eine um Laengen schnellere Ausfuehrung ergibt. Und das ist bei so großen Datenmengen schon ein Pfund, wenn man nicht auf so potente Hardware wie die, die Du hier immer wieder schilderst, zurueckgreifen kann.  :'( :'( :'(

LED ZEPPELIN

#139
Irgendwas läuft da völlig schief.
Da kommen Dateien raus die alle die gleiche Größe haben bzw. die, die nur aus einer Datei bestehen haben die Größe der nächsten Datei mit mehreren Teilen?

Da das Skript wie gesagt immer wieder auf vorher schon bearbeitete Dateien zurückgreift bin ich mir nicht sicher ob es jemals fertig wird.

LED ZEPPELIN

Ich kriege morgen 16 GB Arbeitsspeicher, das hilft hoffentlich etwas.

Mam

#141
Zitat von: tsduser am Juni 18, 2020, 21:33:47Und das ist bei so großen Datenmengen schon ein Pfund, wenn man nicht auf so potente Hardware wie die, die Du hier immer wieder schilderst, zurueckgreifen kann.  :'( :'( :'(
Nicht weinen bitte  :-[
Das Zeuch wird doch stetig billiger,bald ist das Massenware.

Ein Tipp: der vorletzte Fileserver von mir steht gerade an der Strasse und wartet auf den Schrotthändler, der ihn einläd!

(ist aber nur ein alter AMD 6 Core mit 32Gb in nem 4U Gehäuse mit 10*Hotswap Einschüben... sauschwer!!!)
(PPS: beim Abholen bitte Schutzkleidung und Handschuhe anziehen! Das Dingen hat über 15 Jahre lang in der Garage (offenes Fenster zum Garten und Frau lagert da im Winter auch immer ihre Blumen ein) überlebt. "Dreck" ist echt untertrieben  ;D Die Miefquirle haben so ziemlich alles eingesaugt, was der Raum zu bieten hatte (das meiste war aber zum Glück schon tot))

Zitat von: LED ZEPPELIN
Ich kriege morgen 16 GB Arbeitsspeicher, das hilft hoffentlich etwas.
Ooops, wie gerade erwähnt, hier liegen 32Gb DDR3 Speicher am Strassenrand...
;D

tsduser

OK, so sollte es jetzt aber wirklich gehen, auch bei Ordnern mit genau einer gefundenen Datei, und ohne den vorherigen Ordner nochmals zu bearbeiten:
                $dateien = $null
                $dateienL = @(Get-ChildItem -File -Path $filesL)
                $dateienN = @(Get-ChildItem -File -Path $filesN)
                $dateienR = @(Get-ChildItem -File -Path $filesR)
                $dateienU = @(Get-ChildItem -File -Path $filesU)

LED ZEPPELIN

Schaut gut aus.
Habe zwei Testläufe gemacht.
Verschiedene Endungen sind kein Problem mehr.
Läuft auch ohne Probleme und Rückwärtssprünge durch.

Log File der Problem HDD von gestern siehe Anhang.

tsduser

Na, das sieht doch erst einmal gut aus so weit...
Ein leerer Ordner ist dabei, GROSSE TS und kleine ts Dateien (werden aber in diesem Log immer sowohl bei dateienL wie auch bei dateienU gefunden, so wie wir es eigentlich erwartet haben)...

Dann sind wir mal gespannt, wie das Log aussieht, wenn wieder ein Problem auftritt.

Ach ja: Die Log-Datei solltest Du vielleicht nach jedem Lauf umbenennen, oder im Erfolgsfalle auch einfach nur loeschen. Sonst wird die immer groesser, weil immer nur hinten drangehaengt wird.

LED ZEPPELIN

Kann ich machen.
Aber das bewegt sich ja im KB Bereich, von daher ist das kein Problem.
Nur das Lesen wird halt irgendwann mühsam.

Vielen Dank mal wieder bis hierhin.

Ich fürchte aber das wars noch nicht. Irgendwelche Probleme werden schon wieder auftreten.

tsduser

Zitat von: LED ZEPPELINNur das Lesen wird halt irgendwann mühsam.
Genau. Speziell fuer die, die Fehler suchen wollen  ;)

Zitat von: LED ZEPPELINIrgendwelche Probleme werden schon wieder auftreten.
Genau deshalb bin ja auf die dann erstellten Logs neugierig.

Du kannst uebrigens auch die Zeile mit dem Namen fuer die Logdatei ergaenzen:
$Log = "I:\Test\" + (Get-Date -Format yyMMdd-HHmmss) + "_Log.txt"
Dann musst Du nur noch aufpassen, dass Du nicht zwei Jobs in derselben Sekunde startest.
(OK, klar kann man auch das verhindern, aber, naja...)

LED ZEPPELIN


LED ZEPPELIN

Hab heute früh das Skript wieder laufen lassen und es war eine Katastrophe.
Dateien wurden mit falschen Inhalten überschrieben (Bsp. Datei ca. 1,6GB groß, mit Inhalt der nächsten Mehrteiligen überschrieben) oder mit Fehlermeldung übersprungen.
Ich versteh nur Bahnhof.
Hab nix geändert zum letzten mal außer natürlich die Pfade.
Im Anhang das logfile.
Es kann doch nicht sein, dass man für jede HDD ein neues Skript braucht. Echt seltsam.

Mam

Hmm, Deine Dateinamen sind ja auch wirklich eine Herausforderung für jedes Skript :-)

Die enthalten so ziemlich ALLES (Punkte, Leerzeichen, Klammern, Zahlen), was man besser NICHT benutzen sollte.

Und manchmal sind sie auch noch unmotiviert abgeschnitten... ("1973. Jom-Kippur. Ein Krieg im Oktobe")

Also, dabei reicht es, wenn man irgendwo schon aus Flüchtigkeit ein Anführungszeichen oder ein Apostroph vergisst, schon fliegt das Skript auf die Nase.

Schon alleine Umlaute sind "gefährlich" in Dateinamen...



www.cypheros.de