Benutzer mit den meisten Antworten
Daten aus Ordner Struktur und "Index" Datei löschen

Frage
-
Hallo Zusammen
Ich habe ein Problem mit dem Schreiben einer Batch Datei (vlt. währe Powershell auch besser) die alte Daten löscht. Sprich den Teil habe ich eigentlich schon:
forfiles /p P:\test\ar1047 /s /m *_* /d -2000 /c “cmd /c IF @isDir EQU FALSE (del /Q /F @path) & cmd /c echo @path;@file;@fdate>> P:\u\ar\deleted.log & cmd /c echo @path @file @fdate”
Das ganze ist eine ziemlich grosse Ordnerstruktur die so bleiben muss, das funktioniert mit dem löschen so auch. Ich habe einen Ordner "ar" in diesem befinden sich die Ordner "ar0001" - "ar1052" und in jedem dieser Ordner sind noch einmal 16 Unterordner und in diesen befinden sich die zu löschenden Dateien.
Das Problem ist das die gelöschten Daten noch in einer Datei mit dem Name "ARCHIV" stehen und diese Datei gibt es in mehrerer Unterordner (für die Daten im jeweiligen Unterordner) des Pfades den ich mit forfiles aufräume.
Ich schreibe die Daten in ein Log file also habe ich mir gedacht ich kann diese Information doch weiter nutzen um in den "ARCHIV" Dateien die entsprechende Zeile zu suchen und zu löschen.
Das Log sieht zur Zeit so aus:
"P:\test\ar1111\1236789_05.txt";"1236789_05.txt";19.06.2019
"P:\test\ar1111\123678_03.txt";"123678_03.txt";19.06.2019
"P:\test\ar1111\12367_02.txt";"12367_02.txt";19.06.2019
"P:\test\ar1111\1236_01.txt";"1236_01.txt";19.06.2019
Die "ARCHIV" DATEI sieht so aus:
VERSION 3.00 PART_NAME;MACHINE_NO;MACHINE_NAME;MATERIAL_NO;MATERIAL_NAME;DIMENSION_X;DIMENSION_Y;DIMENSION_Z;HEADER_LINE_01;HEADER_LINE_02;HEADER_LINE_03;HEADER_LINE_04;HEADER_LINE_05;HEADER_LINE_06;HEADER_LINE_07;HEADER_LINE_08;HEADER_LINE_09;HEADER_LINE_10;HEADER_LINE_11;HEADER_LINE_12;HEADER_LINE_13;HEADER_LINE_14;HEADER_LINE_15;HEADER_LINE_16;HEADER_LINE_17;HEADER_LINE_18;HEADER_LINE_19;PART_AREA;PART_AREA_CN;PART_WEIGHT;PART_WGHT_CN;PART_COST_MAIN_TIME;SDATE;STIME; "236749_001_02(M2)";2;"Salvagnini S4";19;"DX51D+ZF100R";2317.000;272.000;1.400;;"TYP1_01_STL_S4";"TYP1_01_STL_S4";"COD";;"DX51D+ZF100R";"KOPFNUMMER_060";"23674912";"236749_001_02";"21.01.2013";"ScRa";"WEMO";"SALVA S4-P4";;;;;;"W 57";614792.500;618075.625;6.7566;6.7927;1.3324;"22.02.2019";"16:08:38"; "236749_001_02";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";2317.000;272.500;1.400;;"TYP_1_01_ST";"TYP_1_01_ST";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23674912";"236749_001_02";"22.05.2012";;"WEMO";;"rusitiafr1";"0";;;;;616057.125;619340.250;6.7705;6.8065;2.2987;"22.02.2019";"16:08:35"; "236781_001_03(M2)";2;"Salvagnini S4";19;"DX51D+ZF100R";1870.000;400.380;1.400;;"652514_001_03";"652514_001_03";"COD";;"DX51D+ZF100R";"KOPFNUMMER_060";"23678113";"236781_001_03";"31.01.2018";;"T1";"SALVA S4-P4";;;;;;;740352.0625;748710.625;8.1365;8.2283;0.237;"28.01.2019";"16:26:51"; "236781_001_03";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";1870.000;400.380;1.400;;"652514_001_03";"652514_001_03";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23678113";"236781_001_03";"11.12.2017";;"T1";;"MEFA";"0";;;;;740352.0625;748710.625;8.1365;8.2283;0.7502;"28.01.2019";"16:26:48"; "236781_001_03_999999";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";1870.000;400.3801;1.400;;"652514_001_03";"652514_001_03";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23678113";"236781_001_03";"11.12.2017";;"T1";;"MEFA";"0";;;;;740352.0625;748710.625;8.1365;8.2283;0.7502;"28.01.2019";"16:17:17";
Das ist natürlich nur ein kleiner Auschnitt, wir sprechen hier von einigen 100'000 Dateien und Zeilen in der "ARCHIV" Dateien. Das ganz muss auch nicht schnell gehen. Sobald mal alle alten Daten gelöscht wurden soll die Batch Datei wöchentlich (Wochenende) über die Aufgabenplanung ausgeführt werden. Dann sind es geschätz so 5000 Dateien pro Woche.
Ich möchte nun die erste Zeile der Log Datei in 3 Variabeln schreiben(path, name & date).
Mit Pfad soll zuerst der Pfad festgelegt werden. Da Drin soll geprüft werden ob die Datei "ARCHIV existiert" wenn nein Zeile in Log löschen und wieder von vorne (Schleife)
Wenn ja soll mithilfe der Variable "name" die Zeile in der "ARCHIV" Datei gesucht werden. Die Variable "date" soll verwendet werden um zu prüfen ob die gefunden Zeile dieses Datum auch enthält,
wenn ja Zeile in der "ARCHIV" Datei und in der Log Datei löschen. Wenn nein nur Zeile in Log löschen und wieder von vorne (Schleife).
Was ich bisher, neben der ForFiles Anweisung habe:
@echo off for /f "delims=; tokens=1" %%a in ('more/e +0 ^< deleted.log') do ( if not defined p set "p=%%a" ) echo %p% for /f "delims=; tokens=2" %%a in ('more/e +0 ^< deleted.log') do ( if not defined n set "n=%%a" ) echo %n% for /f "delims=; tokens=3" %%a in ('more/e +0 ^< deleted.log') do ( if not defined d set "d=%%a" ) echo %d% pause findstr /V /s "1236789" ARCHIV.txt > P:\test\ar1111\ARCHIV_.txt
Das Problem ist da auch noch das die neue Datei den Pfad enthält. Das sieht dann so aus:
ar1111\ARCHIV.txt:1236_01.txt
ar1111\ARCHIV.txt:12367_02.txt
ar1111\ARCHIV.txt:123678_03.txt
anstatt so:
1236_01.txt
12367_02.txt
123678_03.txt
Kann mir da jemand helfen?
GrussFabio
- Bearbeitet FabioMeh Donnerstag, 20. Juni 2019 12:02
Antworten
-
> vlt. währe Powershell auch besser
das wäre in der Tat besser, dann müsste ich deine Frage nämlich nicht aus dem Powershell-Forum hier verschieben. :)
Also wenn du das mit Powershell lösen möchtest, wäre die Frage du schon mal irgend etwas mit PoSh gemacht hast? Wenn nein, kommst du nicht umhin dir erstmal ein paar Basics anzuschauen: Link
Falls ja, ist der schnellste (und auch am wenigsten selbstmörderische) Weg solch große Dateien sicher zu bearbeiten, diese zeilenweise einzulesen und dann -minus der unerwünscheten Zeilen- neu zu schreiben.
Ein Grundgerüst für diese Aufgabe wäre das hier:
$Sourcefile = "D:\oldfile.txt" $targetfile = "D:\newfile.txt" $reader = new-object System.IO.StreamReader $Sourcefile $writer = new-object System.IO.StreamWriter $targetfile do { # Zeile einlesen $zeile = $reader.ReadLine() # vergleich mit suchstring # schreiben $writer.WriteLine($line) } while (!($reader.EndOfStream)) $reader.Close() $writer.close()
Grundsätzlich gruselt es mich aber bei der Vorstellung das relevante Daten in riesige Textdatei gestopft werden, in der bei Bedarf rumeditiert wird. Das ist schon fast mutwillig fahrlässig. Da kann man nur hoffen das diese nicht wirklich wichtig sind, wobei sich dann allerdings die Frage stellen würde, was das ganze dann überhaupt soll. :)
Gruß, Denniver
Blog: http://www.bytecookie.de
Powershell Code Manager: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 20. Juni 2019 13:28
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Freitag, 21. Juni 2019 12:35
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 2. Juli 2019 11:02
Alle Antworten
-
> vlt. währe Powershell auch besser
das wäre in der Tat besser, dann müsste ich deine Frage nämlich nicht aus dem Powershell-Forum hier verschieben. :)
Also wenn du das mit Powershell lösen möchtest, wäre die Frage du schon mal irgend etwas mit PoSh gemacht hast? Wenn nein, kommst du nicht umhin dir erstmal ein paar Basics anzuschauen: Link
Falls ja, ist der schnellste (und auch am wenigsten selbstmörderische) Weg solch große Dateien sicher zu bearbeiten, diese zeilenweise einzulesen und dann -minus der unerwünscheten Zeilen- neu zu schreiben.
Ein Grundgerüst für diese Aufgabe wäre das hier:
$Sourcefile = "D:\oldfile.txt" $targetfile = "D:\newfile.txt" $reader = new-object System.IO.StreamReader $Sourcefile $writer = new-object System.IO.StreamWriter $targetfile do { # Zeile einlesen $zeile = $reader.ReadLine() # vergleich mit suchstring # schreiben $writer.WriteLine($line) } while (!($reader.EndOfStream)) $reader.Close() $writer.close()
Grundsätzlich gruselt es mich aber bei der Vorstellung das relevante Daten in riesige Textdatei gestopft werden, in der bei Bedarf rumeditiert wird. Das ist schon fast mutwillig fahrlässig. Da kann man nur hoffen das diese nicht wirklich wichtig sind, wobei sich dann allerdings die Frage stellen würde, was das ganze dann überhaupt soll. :)
Gruß, Denniver
Blog: http://www.bytecookie.de
Powershell Code Manager: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 20. Juni 2019 13:28
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Freitag, 21. Juni 2019 12:35
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 2. Juli 2019 11:02
-
das wäre in der Tat besser, dann müsste ich deine Frage nämlich nicht aus dem Powershell-Forum hier verschieben. :)
Ja ich weiss das es nur so halb im richtigen Bereich ist aber ich habe kein Batch Bereich bzw. für anderen Programmiersprachen gefunden.
Ich habe schon einmal ein simples Script in Powershell geschrieben das Daten von einem auf den anderen Server kopiert (frag gar nicht erst wieso das das nötig ist). Jedoch war das schon nicht so einfach für ich da erschien mir eine Batch Datei einfacher. Vorallem da ich das löschen und loggen der gelöschten Daten ja schon habe.
Ich habe sieht ich die Frag gestellt habe noch ein wenig recherchiert und es scheint wohl so das dass was ich möchte doch ein bisschen viel ist für ein Batch Script.
Danke für deinen Input, ich schaue mir das mal ob ich damit was anfangen kann.
Also eigentlich sind es alles nur Dateien ohne Endung. Ich habe mir für das Testen einfach mal Daten als Txt angelegt. Macht es auch nicht gerade besser aber so funktioniert das Programm das diese Daten erzeugt. Mir passt das auch nicht da ich jetzt eine Lösung suchen muss wie ich die Datenflut in den Griff bekomme ohne das Programm und die aktuellen Daten unbrauchbar zu machen.
Das Programm besitzt neben einer extrem langsame und mühseligen Möglichkeit keine weitere Möglichkeit alte Daten automatisch oder schneller zu löschen. Es ist denke ich auch nicht für so viele Daten ausgelegt wie wir erzeugen.
Das Prinzip das ich möchte funktioniert problemlos von Hand, ich würde es nur gern automatisieren.
Die Daten sind relativ wichtig können aber bei Bedarf vom ERP System wieder erzeugt werden.
-
Das klappt schon. Wichtig ist, stur Schrittf-für-Schritt vorzugehen und ein Problem nach dem andern anzugehen. Und bei Problemen kommst du wieder her. :)
Blog: http://www.bytecookie.de
Powershell Code Manager: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.