tulekparson
Goto Top

Batch Frage - alle Dateien in einem Ordner einlesen ändern dann einmal kopieren und dann verschieben

Hallo Forum,
Ich weiß, daß mein Problem relativ trivial ist, allein mir fehlt der Durchblick.
Ich möchte Inventurdateien in einem Ordner einlesen, diese von Leerzeilen befreien und letztendlich
einmal in einen Sicherungsordner kopieren und zu guter Letzt in den eigentlichen Inventurordner verschieben.

So:

In einem Ordner A liegen Inventurdateien vom Namensformat sehen die wie folgt aus:

abteilunng.inventurnr.mde
also zum Beispiel
schreibwaren.1052.mde

Ich brauche eine Batchdatei die folgendes leistet:

  • Alle Dateien in Ordner A einlesen
  • Die gefundenen Dateien von Leerzeilen befreien
evtl. mit
findstr .$^ alter Name>neuer Name
?
  • Die veränderten Dateien (die idealerweise noch immer ihren Dateinamen behalten haben) in einen Ordner B kopieren
  • Und dann die veränderten Dateien in Ordner C verschieben.

Das Verzeichnis sollte nach dem Batchaufruf leer sein.

Das müsste mit einer Batch zu schaffen sein, aber mein Kopf meldet gerade permanent TILT zumal ich hier nebenher
noch vorweihnachtlichen Kundenverkehr habe...
Wer erbarmt sich und hilft mir in meiner Not?

Ich bin Euch ewig dankbar für sachdienliche Hinweise!
Kommentar vom Moderator Biber am Nov 19, 2010 um 10:20:58 Uhr
Bereits gelösten Beitrag verschoben von "Tools & Utilities" nach "Batch & Shell".

Content-Key: 155346

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: micneu
micneu Nov 18, 2010 at 16:08:15 (UTC)
Goto Top
* Die veränderten Dateien (die idealerweise noch immer ihren Dateinamen behalten haben) in einen Ordner B kopieren
  • Und dann die veränderten Dateien in Ordner C verschieben.

warum sollen die datein einmal in B und dann nochmal in C gespeichert werden?
sind die verzeichnisse schon angelegt?

gruß michael
Member: tulekparson
tulekparson Nov 18, 2010 at 16:11:05 (UTC)
Goto Top
Die Verzeichnisse sind vorhanden.

Die Warenwirtschaft löscht die Dateien nach dem Einlesen, um Katastrophen zu verhindern
sichern wir alle Inventur(roh)daten.
Mitglied: 60730
60730 Nov 18, 2010 at 16:43:04 (UTC)
Goto Top
Servus,

  • Alle Dateien in Ordner A einlesen
  • Die gefundenen Dateien von Leerzeilen befreien
  • Die veränderten Dateien (die idealerweise noch immer ihren Dateinamen behalten haben) in einen Ordner B kopieren
for /f %%a in ('dir /b C:pfad1*.mde') do (  
		for /f %%l in (%%a) do if not "%%l"=="" echo %%l>>C:pfad2\%%a  
)

  • Und dann die veränderten Dateien in Ordner C verschieben.
TILT meldet da auch mein Kopf..
Außer du meinst eine zusätzliche Zeile 3 - die da sinngemäß:
copy C:pfad1\%%a C:pfad2\%%a
lauten soll....


Sollte aber auch zu lösen sein...

Wobei ich das Forum mal wieder ein Problem mit [AltGr] [9][2] habe


Gruß
Member: tulekparson
tulekparson Nov 18, 2010 at 17:10:52 (UTC)
Goto Top
Leerzeilen löschen funktioniert, aber das kopieren klappt nicht
"Datei xy konnte nicht gefunden werden"
Member: bastla
bastla Nov 18, 2010 at 17:39:22 (UTC)
Goto Top
Hallo tulekparson und T-Mo!

Das Ganze etwas variiert (und hoffentlich auch performanter):
for %%a in ("C:\Pfad1\*.mde") do (  
    findstr /v "^$" "%%a">"C:\Pfad2\%%~nxa"  
    copy "C:\Pfad2\%%~nxa" "C:\Pfad3">nul && del "%%a"  
)
Grüße
bastla
Member: micneu
micneu Nov 18, 2010 at 17:58:02 (UTC)
Goto Top
ich habe hier die ungetestete powershell version:

#   **************************************************************
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted" 
#   **************************************************************
#    
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   18.11.2010      *
#   **************************************************************

$QUELLE = "c:Temp"  
$ZIEL = "c:\Temp2010"  
$ZIEL2 = "c:\Temp2010\11"  

$FILE = Get-ChildItem $QUELLE -filter '*.txt'  
foreach ( $i in $FILE ) {    
    $TEXT = Get-Content "$QUELLE\$i" | Out-String  
    $TEXT2 = $TEXT  -replace '\s\B','' #| Out-String  
    Move-Item -path "$QUELLE\$i" -destination "$ZIEL\$i"  
    $TEXT2 > "$ZIEL2\$i"  
    }

gruß michael
Member: micneu
micneu Nov 18, 2010 at 18:20:45 (UTC)
Goto Top
und hier die getestet powershell version:

#   **************************************************************
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted" 
#   **************************************************************
#    
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   18.11.2010      *
#   **************************************************************

$QUELLE = "c:\Temp"  
$ZIEL = "c:\Temp2010"  
$ZIEL2 = "c:\Temp2010\11"  

$FILE = Get-ChildItem $QUELLE -filter '*.txt'  
foreach ( $i in $FILE ) {    
    $TEXT = Get-Content "$QUELLE\$i"      
    $TEXT2 = $TEXT | Where-Object { $_ -ne "" }  
    Move-Item -path "$QUELLE\$i" -destination "$ZIEL\$i"  
    $TEXT2 > "$ZIEL2\$i"     
    }

gruß michael
Member: tulekparson
tulekparson Nov 19, 2010 at 10:14:19 (UTC)
Goto Top
Super,

Vielen Dank an alle die sich an meinem Problem versucht haben.
Aufgrund eines gewissen Zeitdrucks habe ich mich für Bastlas Lösung entschieden.

Läuft wunderbar face-smile

Dank gebührt aber auch TimoBeil und micneu, die sich ebenfalls eine Lösung einfallen haben lassen. Ich weiß es durchaus zu schätzen, daß Ihr Euch einfach mal rangesetzt habt und mir aus der Patsche geholfen habt.

Zu micneu:

Ich habe noch nicht mit Powershell gearbeitet und da ich den Code u.U. anpassen muss habe ich mir das nicht weiter angeguckt, werde ich aber sicherlich mal nach Weihnachten tun.

Wenn es Eure Zeit zulässt würde ich gern mal den Code von Bastla erklärt haben.

Ich weiß das > quasi eine Pipe (Unix) ist, richtig?
eine for-Schleife sehe ich auch.
Aber diese %% und %%~ Konstrukte sind wahrscheinlich der Kasus Knaxus. Kann mir das mal jemand übersetzen?

Danke.
Member: bastla
bastla Nov 19, 2010 at 10:50:01 (UTC)
Goto Top
Hallo tulekparson!
Kann mir das mal jemand übersetzen?
Für die paar Zeilen habe ich auch selbst Zeit face-wink ...
for %%a in ("C:\Pfad1\*.mde") do (
Schleife, um alle *.mde-Dateien durchzugehen - diese stehen innerhalb der Schleife als "%%a" zur Verfügung.
    findstr /v "^$" "%%a">"C:\Pfad2\%%~nxa"
Mit "^" für "Zeilenbeginn und "$" für Zeilenende (und nix dazwischen) lassen sich die Leerzeilen in der Datei "%%a" finden und per "/v" ausfiltern (ähnelt damit Deinem Ansatz).
Das Ergebnis wird (per Ausgabeumleitung mit ">") in eine neue Datei geschrieben, wobei Dateiname und - extension von der ursprünglichen Datei übernommen werden (Näheres dazu findest Du am Ende der Online-Hilfe ("for /?").
    copy "C:\Pfad2\%%~nxa" "C:\Pfad3">nul && del "%%a"
Die im "Pfad2" neu erstellte Datei enthält jetzt keine Leerzeilen mehr und kann daher (unter dem gleichen Namen, daher genügt die Angabe des Pfades) in den "Pfad3" kopiert werden (wobei die Meldung "1 Datei(en) kopiert." ja nicht wirklich so aussagekräftig ist, dass sie auch ausgegeben werden müsste - daher: weg damit in Richtung "nul"-Device).

Wenn der Kopiervorgang ohne Fehler endet (deshalb die bedingte Verknüpfung mit "&&" anstelle von "&") kann die Originaldatei gelöscht werden.
)
Ende der Schleife face-wink

Grüße
bastla
Member: tulekparson
tulekparson Nov 19, 2010 at 15:35:23 (UTC)
Goto Top
Fantastisch face-smile

Wieder bin ich ein bisschen schlauer!