Batch Datei automatisiert befüllen?

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

« vorheriges - nächstes »

LED ZEPPELIN

Das Überschreiben der Dateien war auf einer anderen HDD. Das hatte mit der kaputten gar nichts zu tun.

Da ich noch eine Liste der Filme der geschrotteten HDD hatte habe ich bisher alles wiederherstellen können.
Für Euch zwei und mich lasse ich auch mal ein paar eigentlich schon gelöschte bzw. überschriebene Daten wiederherstellen um zu sehen in weit diese noch brauchbar sind.
Bisher waren die Dateien auch alle brauchbar. Habe natürlich nur Stichproben machen können.
Das die Alle kaputt sind habe ich ohnehin nicht angenommen, da ja nur der Bootsektor geschrottet wurde.
Hatte ich vor Jahren schon mal und konnte alles retten.

Mam

Na ja, Deine Infos sind etwas sprunghaft, da kann man schon durcheinander kommen  ;D

LED ZEPPELIN

Hier mal die neuesten Infos.
Alle Dateien wieder da. Nur brauchen sie mehr Platz als vorher.
Soll heißen, es gehen nicht mehr alle Filme die vorher auf der Platte waren auf eine 3TB HDD obwohl sie vorher auf einer drauf waren.
Keine Ahnung warum.
Das Verzeichnis mit den Filmen hatte ich mit Powershell direkt aus der HDD ausgelesen.
Sehr seltsam.
Aber egal.
Von den Dateien die bereits überschrieben waren konnte ich etwa die Hälfte wieder herstellen und auch ansehen bzw hören. Der Rest war unbrauchbar.
Dies ist die klare Bestätigung für mich, das man HDDs x-fach überschreiben muss um alte Daten wirklich unlesbar zu machen.

Nun zum Skript:
Ich habe folgendes in Powershell ISE eingetragen und das Ergebnis unten erhalten:
PS C:\Users\ICH> # Quellverzeichnis mit Ordnern
>> $Quelle = "N:\"
>>
>> # Zielverzeichnis der .ts Ausgabedatei(en)
>> $Ziel = "L:\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"
>>       # Ziellaufwerk
            $ZielLW = Split-Path -Qualifier $Ziel
            # Datenmenge summieren
            $Datenmenge = ( Get-ChildItem -File -Path $files | Measure-Object Length -Sum ).Sum
            # Freier Platz auf Ziellaufwerk
            $freierPlatz = ( Get-WMIObject Win32_LogicalDisk -filter "name='$ZielLW'" ).FreeSpace
            if ( $Datenmenge -gt $freierPlatz ) { Read-Host -Prompt "Freier Platz auf Ziel $ZielLW reicht nicht aus!`r`nAbbruch mit <Ctrl-C>, trotzdem weiter mit <Enter>." }
>>             # 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:46 Zeichen:8
+ >>     } else { Write-Host "Keine Ordner in $Quelle gefunden." }
+        ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.
In Zeile:47 Zeichen:4
+ >> } else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }
+    ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken


PS C:\Users\ICH>

Irgendwelche Ideen was ich machen kann damit das funktioniert?


LED ZEPPELIN

Ich habe jetzt nochmal das Original von Seite drei in das normale Power Shell eingefügt, funktioniert leider auch nicht richtig.
Es werden jetzt die Dateien in der falschen Reihenfolge zusammengefügt, woran liegt das?
Ich versteh überhaupt nix mehr.

Ursprung ist N Ziel ist L. Kann das das Problem sein?

LED ZEPPELIN

Wenn ich es als .ps1 Datei speichere startet es zwar, fügt die Dateien aber auch in der falschen Reihenfolge zusammen. Woran liegt das?
Beim ersten Mal hat es doch auch funktioniert.

tsduser

#65
Die geposteten Fehlermeldungen sind doch mehr oder weniger dieselben, die Du bereits schon mal hochgeladen hast, und wo Dir geraten wurde, das Script eben NICHT direkt auf die auszufuehrende Kommandozeile zu pasten.

In der PoSh ISE musst Du das Script in dem WEISSEN Bereich oben ablegen (ggfs.ueber Datei-> Neu einen zur Anzeige bringen), und NICHT auf den blauen Bereich unten...

Die Reihenfolge der Quelldateien in der Zieldatei entspricht der Sortierreihenfolge der Dateinamen in der Eingabeaufforderung. Auf NTFS funktioniert das allermeistens, weil das Dateisystem von sich aus sortiert (wenn auch nicht unbedingt immer so wie man selber es will). Der copy-Befehl prueft den Inhalt der Dateien NICHT, sorgt also NICHT dafuer, dass die logische Reihenfolge ggfs. korrigiert wird. Das macht halt der TS-Doctor (allermeistens sehr gut, aber...).

Fuer eine (besser) passende Reihenfolge ggfs. auch auf anderen Dateisystemen wie FAT(32) musst Du also selber sorgen, z.B. dadurch, dass Du die Dateinamen alphabetisch aufsteigend vorgibst, und systemweit (d.h. auf allen Dateisystemen) Deinem Windows beibringst, auch selber alphabetisch zu sortieren. Dies geht recht einfach per Umgebungsvariable in den Erweiterten Systemeigenschaften (Variable: dircmd, Wert: /OGNE; ob Du Benutzervariablen oder Systemvariablen waehlst, bleibt Dir ueberlassen). Hemdsaermeliger kannst Du auch eine Zeile im Script aendern, und ein "set dircmd=/OGN & " einfuegen:
Start-Process -FilePath "$env:comspec" -ArgumentList "/c","set dircmd=/OGN & copy","/b",$files,$target -Wait
Das sollte als Notbehelf auch funktionieren; probiere es aber besser aus, bevor Du irgendwelche Quelldateien loeschst.

Zur dem was Wiederherstellungsprogramme koennen (und manchmal eben nicht) habe ich mich bereits eingelassen. Das Unlesbarmachen alter Dateien hat jedenfalls nichts mit mehrfachem Ueberschreiben zu tun (bzw. nicht alleine); da sind die Zusammenhaenge doch ein wenig komplizierter. Aber das wuerde hier jetzt ganz sicher zu weit fuehren.

LED ZEPPELIN

Habs geändert. Hat leider nicht funktioniert.
Du meinst es liegt an der FAT32 Formatierung der HDD.
Die HDD bei der es funktioniert hat ist aber auch in FAT32 formatiert.
Habe gerade nochmal getestet und es funktioniert auf dieser auch immernoch korrekt.
Also muss ich irgendwie die erweiterten Systemeigenschaften ändern.
Mal sehen ob ich das hinkriege.

LED ZEPPELIN

Hab die Variable eingetragen.
Ändert auch nichts.
Liegts vielleicht daran, dass die HDD über USB angeschlossen ist und die bei der es funktioniert intern?

tsduser

Nein, daran liegt es ganz sicher nicht. Und auch der Hinweis auf FAT32 wurde als MOEGLICHE, BEISPIELHAFTE Ursache genannt.

Vergleiche doch mal die Namen der Eingabedateien, einmal von da, wo es funktioniert hat, und einmal da wo eben nicht.

Oder zeige sie uns einfach. Ist ja nicht so, dass nicht vor zig Beitraegen schon einmal danach gefragt worden waere ;-)

LED ZEPPELIN

#69
Echt. Habe ich wohl übersehen.
Im Anhang mal zwei Bilder.
Gatsby ist von der HDD die funktioniert und Sherlock von der in der die Reihenfolge falsch ist.
Ich habe diese beiden genommen, da das Skript immer mit ihnen beginnt.

Die Ordner liegen direkt auf der höchsten Ebene auf beiden HDDs.

Ich kann da keine Unterschiede erkennen.

tsduser

#70
Dann schau Dir mal die Antworten #26 und #35 an...  :D

Aber ist ja jetzt egal; jetzt haben wir ja Beispiele.
Leider sehe ich aber auch keine das Verhalten erklaerende Unterschiede.
Ist es denn so, dass auf der Gatsby-Platte ALLE Zusammenfuegungen korrekt durchliefen, und auf der Sherlock-Platte ALLE (bisher probierten) falsch waren?

Wurden auf einer der beiden Platten irgendwelche Dateiumbenennungen vorgenommen? Wenn ja, welche?

Ach ja:
Kannst Du bitte auf der Eingabeaufforderung in beiden Verzeichnissen mal "dir /-o /x" ausfuehren, und die Ausgaben hier posten?

LED ZEPPELIN

So weit ich das überblicke ist nur eine Zusammenfügung fehlgeschlagen. Das waren aber auch Dateien die split 001.ts und split 002.ts am Ende hießen.
Die Daten siehe Dokument im Anhang.

LED ZEPPELIN

#72
Auf der anderen haben alle Zusammenfügungen die ich versucht habe in der falschen Reihenfolge stattgefunden.
Siehe Anhang

LED ZEPPELIN

Bezüglich Dateiumbenennungen kann ich nicht mehr genau sagen.
Ich glaube ich habe alle mal durch ein Programm umbenennen lassen womit das Datum, Sendername, Uhrzeit  etc. im Dateinamen entfernt wurde.
Das ist aber vermutlich auf beiden Platten gelaufen.

LED ZEPPELIN

#74
Habe folgenden Tipp bekommen:

"Alle Dateien aus dem Verzeichnis in einer TXT, die TXT in Excel importieren und mit deinem Copy Befehl verknüpfen, schon kannst Du kopieren und zusammenfügen. ;)"

Wie das genau gehen soll ist mir aber nicht klar. Also das Verknüpfen der Excel Liste mit dem Copy Befehl.


www.cypheros.de