Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Ordner durchsuchen und bestimmten Text Inhalt ausgeben

Frage Entwicklung Batch & Shell

Mitglied: matze-pe

matze-pe (Level 1) - Jetzt verbinden

29.09.2009 um 10:42 Uhr, 7698 Aufrufe, 24 Kommentare

Hallo,
ich möchte ein Batch programmieren, der mir alle Dateien (*.d01) im Ordner nach "ID und eine fortlaufende Nummer" durchsucht und die "ID+fortlaufende-Nr" in eine Textdatei (datei.txt) ausgibt.


Mein Skript durchsucht bereits Dateien, aber öffnet jede einzelne und die fortlaufende Nummer hab ich mit dem Suchoperator % bestimmt. Das klappt bei mir auch noch nicht.


Der Dateiinhalt der einzelnen Dateien sieht wie folgt aus:

'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'

usw.


Hier mein Skript:


for /F "delims=" %%a in ('dir /b /s *.d01') do (find "'ID+%'" "%%~fa" && "%%~fa">> datei.txt)


Könnt ihr mir sagen wo mein Fehler liegt?



mfg
Matze
Mitglied: matze-pe
29.09.2009 um 13:27 Uhr
Hab hier in der Forumsuche ein ähnliches Skript gefunden, das bei mir aber nicht zu 100% funktioniert.


@echo off & setlocal
set "Suche='ID+%%%'"
set "Erg=Liste.log"
set "Logs=C:\G4"
pushd "%Logs%"
findstr /i /m /c:"%Suche%" "*.d01">"%Erg%"
popd


Er kann die fortlaufende Nummer nicht finden, das geht doch mit dem %-Zeichen, oder?

Jetzt listet er mir nur den Dateinamen auf, es soll zusätzlich der Inhalt mit aufgelistet werden.


Wie bekomm ich das denn hin?
Bitte warten ..
Mitglied: matze-pe
29.09.2009 um 20:13 Uhr
Hallo,
hat keiner eine Idee?

Ich weiß nicht weiter.



Gruß
Matze
Bitte warten ..
Mitglied: Biber
29.09.2009 um 21:23 Uhr
Moin Matze,

bei dir fehlt in dem ersten Skript nach dem "&&" ein ECHO... deshalb wir die gefundene Textdatei ausgeführt und nicht nur der als Dateiname in der Liste aufgeführt.

Das zweite Sript passt bei dir nicht ganz, weil da der FindStr-Schalter /M verwendet wird... und der ist zwar sehr nützlich, aber nicht für deine Zwecke. Denn /M zeigt <u>nur</i> die Dateinamen an.
du willst, wenn ich es Recht verstanden habe, Dateinamen UND die Fundzeile?

Da wäre mein Tipp
01.
(=21:22:26  E:\Schnipsel=) 
02.
>FindStr  "'" d:\temp\*.d01 
03.
d:\temp\matze1.d01:'ID+001' 
04.
d:\temp\matze2.d01:'ID+002' 
05.
d:\temp\matze3.d01:'ID+003' 
06.
d:\temp\matze4.d01:'ID+004' 
07.
d:\temp\matze5.d01:'ID+005'
Ggf. den "Findstr "'" c:\G4\*.d01" noch mit ">D.\Einpfad\EinError.log" in einen Datei umleiten.

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
30.09.2009 um 09:46 Uhr
Hallo Biber,
danke für deine Antwort.

Ich hab dein Skript bei mir jetzt eingebunden und getestet, aber es klappt nicht.

Du hast jetzt die einzelnen ID's so aufgelistet, was muss denn geändert werden das er alle ID's einliest. In dem Ordner befinden sich mehr als 1000 Dateien. Und jede Datei ein eine eindeutige ID.


>FindStr "'" C:\G4\*.d01


Die Zeilen 3 - 7, sollte das bei dir nur die Ausgabe sein?



Gruß
matze
Bitte warten ..
Mitglied: Biber
30.09.2009 um 14:39 Uhr
Moin matze-pe,

Die Zeilen 3 - 7, sollte das bei dir nur die Ausgabe sein?
Ja, das ist nur die Ausgabe.

Und bei der Zeile
01.
>FindStr "'" C:\G4\*.d01
... ist das erste ">"-Zeichen nur meine CMD-Prompt-Anzeige.
DIESES ">"- ZEICHEN NICHT MIT EINGEBEN bitte.

Im Batch also nur:
01.
... 
02.
FindStr "'" C:\G4\*.d01 
03.
...
Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
30.09.2009 um 15:06 Uhr
Moin Biber,
danke hab das jetzt bei mir so eingefügt.

Wenn ich jetzt nur bei der Suche meine ID / Sequenz eingebe, werden mir alle Dateien in einer neuen Textdatei (datei.txt) zusammengefasst die rund 100MB groß ist :D

Und wenn ich den Suchoperator benutze, findet er gar nichts --> 'SEQ+3+*'


for /F "delims=" %%a in ('dir /b /s *.d01') do (FindStr "'SEQ+3+*'" C:\G4\*.d01>> datei.txt)


Meine Ergebnisdatei (datei.txt) soll am Ende so aussehen:

dateinamen1.d01 SEQ+3+0000001
dateinamen2.d01 SEQ+3+0000002
dateinamen3.d01 SEQ+3+0000003
dateinamen4.d01 SEQ+3+0000004


Wie löse ich das am besten mit dem Suchen nach 'SEQ+3+ZAHL'



Gruß
Matze
Bitte warten ..
Mitglied: Biber
30.09.2009 um 16:06 Uhr
Moin matze-pe,

bitte ändere Deine Zeile
von bisher
01.
for /F "delims=" %%a in ('dir /b /s *.d01') do (FindStr "'SEQ+3+*'" C:\G4\*.d01>> datei.txt)
in neu
01.
FindStr "'SEQ+3+" C:\G4\*.d01>> datei.txt
Mehr nicht.

Als Zweites (unabhängig von Variante 1; die sollte alles tun, was ich möchte) kannst Du erwägen

01.
:: REM Optional -- oder etwas sicherer: 
02.
FindStr /i /C:"'SEQ+3+" C:\G4\*.d01>> datei.txt
Die Scaalter /i und C: bewirken, wie dir sicherlich die FindStr/?-Ausgabe schon erzählt hat, dass es egal ist, ob Klein/oder Grossbuchstaben und /C: wiederum bedeutet, buchstabengetreuen vollständigen Vergleich.
Nur für den Fall, dass Du in Deinem Suchstring noch exotischere Zeichen als "+" drinhast.

Dass jetzt deine Ergebnisdatei die einfachen Anführungszeichen nicht mehr erhalten soll und die für mich nicht verständliche Frage
Wie löse ich das am besten mit dem Suchen nach 'SEQ+3+ZAHL'
...habe ich noch nicht berücksichtigt.

Bitte lass uns erst mal einen Schritt machen und etwaige Kommunikationsprobleme ausmerzen.

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
30.09.2009 um 16:27 Uhr
Hallo,
ok das hat schonmal geklappt (hab deine Variante 2 genommen), jetzt sieht die Ergebnisdatei wie folgt aus

C:\G4\dateinamexyz.d01 Und hier hinter steht der komplette Inhalt der Datei.


Anstatt den gesamten Inhalt darzustellen benötige ich nur die Zeile 'SEQ+3+fotlaufende Zahl'



mfg
Matze
Bitte warten ..
Mitglied: Biber
30.09.2009 um 17:03 Uhr
Okay, matze-pe,

ich glaube, jetzt hab ich das Missverständnis eintdeckt.
Ich war davon ausgegangen, dass jede .d01-Datei einen String mit "SEQ+3+LfdNr" enthält.
Es scheint aber so, als würde jede Datei viele Zeilen mit "SEQ+3+diverseLfdNr" enthalten.

In diesem Fall sollte die Zeile lauten
01.
FindStr /i /C:"'SEQ+3+0000004" C:\G4\*.d01>> datei.txt
wenn du nach der lfd. Nr 0000004 suchst
-oder, wenn Du es als Batch paramtergesteuert machen willst-
01.
:. MatzesSuchDieID.cmd 
02.
:: Rem optionaler parameter 1 ist eine lfd. nummer = der EXAKTE Teil nach "SEQ+3+" 
03.
FindStr /i /C:"'SEQ+3+%1" C:\G4\*.d01>> datei.txt
Aufruf mit "MatzesSuchDieID 0000017" sollte eine Liste mit allen Fund-Zeilen aller .d01-Dateien enthalten, in denen
"'SEQ+3+0000017" steht.

Wenn ich die Aufgabe jetzt richtig verstanden habe...

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
30.09.2009 um 19:38 Uhr
Hallo Biber,
ja richtig, jede Datei hat eine eindeutige Laufende Nummer. Und diese Nummer kommt mehrmals in der einen Datei vor.

Wenn ich das Skript ausführe, steht in der datei.txt immernoch der gesamte Inhalt aller Dateien.


Ich hab dir mal eine Beispieldatei mit angehängt:

UNB+UNOA:2+O0013000001
KPP+O0013000894+090727:0653+027065344339'UNH+1+:D:97A:UN'BGM+30::10:SYNCRO+000001'DTM+137:200907270653:203'NAD+BY+::92'NAD+CN+11'NAD+CZ+137970'SEQ+3+010575'DTM+194:200907270653:203'GIR+ADD+027065344339:SSR+L47299006361:SVS'GIR+4+KZAW069934:+0931106481:TMA+EP:PGI'LOC+54+M100'LIN+++ 5K6 867 212 EN YDV :IN'QTY+131:1:PCE'LIN+++ 5K4 867 470 YLT :IN'QTY+131:1:PCE'LIN+++ 1K0 947 419 A :IN'QTY+131:1:PCE'LIN+++ 7L6 868 243 :IN'QTY+131:6:PCE'LIN+++ L5K 000 029 A :IN'QTY+131:1:PCE'LIN+++ 1K8 971 798 :IN'QTY+131:1:PCE'LIN+++ N 909 187 01 :IN'QTY+131:3:PCE'LIN+++ 5K4 868 714 A 81U :IN'QTY+131:1:PCE'SEQ+3+010575'DTM+194:200907270653:203'GIR+ADD+027065344339:SSR+L47299006361:SVS'GIR+4+KZAW069934:VV+0931106481:AN+105K1:TMA+EO:PGI'LOC+54+M100'LIN+++ 5K6 867 211 EN YDV :IN'QTY+131:1:PCE'LIN+++ 5K4 867 469 YLT :IN'QTY+131:1:PCE'LIN+++ 1K0 947 419 A :IN'QTY+131:1:PCE'LIN+++ 7L6 868 243 :IN'QTY+131:6:PCE'LIN+++ L5K 000 029 :IN'QTY+131:1:PCE'LIN+++ 1K8 971 798 :IN'QTY+131:1:PCE'LIN+++ N 909 187 01 :IN'QTY+131:3:PCE'LIN+++ 5K4 868 713 A 81U :IN'QTY+131:1:PCE'SEQ+3+010575'DTM+194:200907270653:203'GIR+ADD+027065344339:SSR+L47299006361:SVS'GIR+4+KZAW069934:VV+0931106481:AN+105K1:TMA+EN:PGI'LOC+54+M100'LIN+++ 5K4 867 012 BK YDV :IN'QTY+131:1:PCE'LIN+++ 1K0 947 419 A :IN'QTY+131:1:PCE'LIN+++ 7L6 868 243 :IN'QTY+131:7:PCE'LIN+++ L5K 000 028 C :IN'QTY+131:1:PCE'LIN+++ 1K8 9771 798 :IN'QTY+131:1:PCE'LIN+++ N 909 187 01 :IN'QTY+131:3:PCE'LIN+++ 5K4 868 714 A 81U :IN'QTY+131:1:PCE'LIN+++ 5K0 8667 102 YLT :IN'QTY+131:1:PCE'SEQ+3+010575'DTM+194:200907270653:203'GIR+ADD+027065344339:SSR+L47299006361:SVS'GIR+4+KZAW069934:VV+0931106481:AN+105K1:TMA+EM:PGI'LOC+54+M100'LIN+++ 1K0 919 238 A :IN'QTY+131:1:PCE'LIN+++ 5K1 867 101 K YLT :IN'QTY+131:1:PCE'LIN+++ 5K4 867 011 BK YDV :IN'QTY+131:1:PCE'LIN+++ 1K0 947 419 A :IN'QTY+131:1:PCE'LIN+++ 7L6 868 243 :IN'QTY+131:7:PCE'LIN+++ 1K8 971 798 :IN'QTY+131:1:PCE'LIN+++ N 909 187 01 :IN'QTY+131:3:PCE'LIN+++ 5K4 868 713 A 81U :IN'QTY+131:1:PCE'LIN+++ L5K 000 028 A :IN'QTY+131:1:PCE'LIN+++ 3C0 919 242 9B9 :IN'QTY+131:1:PCE'UNT+95+1'UNZ+1+027065344339'



Hier wäre die ID = 'SEQ+3+010575'

In der nächsten Datei wäre die ID = 'SEQ+3+010576'


Und ich möchte nur diese ID's aller Dateien aufgelistet haben



Vielen Dank


Gruß
Matze
Bitte warten ..
Mitglied: matze-pe
01.10.2009 um 13:39 Uhr
Hallo Biber,
hilft dir die Datei weiter?
Bitte warten ..
Mitglied: Biber
01.10.2009 um 18:31 Uhr
Moin matze-pe,

vielleicht wäre es ein wenig schneller gegangen oder mit ein paar unnötigen Schleifen weniger, wenn sich nicht nach erst nach 10maligem Hin- und Herposten herausstellt, das die ursrüngliche Angabe:

Der Dateiinhalt der einzelnen Dateien sieht wie folgt aus:

'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'
....eigentlich ein bisschen sehr vereinfacht und ein bisschen zu schematisch ist.

Diese .d01-Dateien scheinen ja, wenn das gepostete Beispiel typisch für dieses Format ist, aus zwei Zeilen zu bestehen.
Wobei die erste Zeile so um die 20 Zeichen lang ist und nie den Suchstring enthält, die zweite Zeile aber über eine Länge von mehr als 2000 Zeichen zigmal den Suchstring enthält.
Entsprechen blieb ja nun weiter oben auch dem FindStr, der die gefundene Zeile durchreichen sollte, auch nichts anderes übrig, als diese zweite Zeile (mit den mehr als 2000 Zeichen) in deine Gesamttreffer-Datei zu schreiben.
Was wiederum zu Deiner 100 MB-Datei führte..
C:\G4\dateinamexyz.d01 Und hier hinter steht der komplette Inhalt der Datei.
Na ja, komplett nicht. Die jeweils ersten Zeilen mit den 20 Zeichen sind nicht drin.
ist also schon recht kompakt...

Anyway, da Zeilen jenseits einer Länge von 2087 Byte vom CMD-Interpreter nicht verarbeitbar sind, wie es von meinem Oneliner-Hobby weiss sehe ich zwei Alternativen:

a) entweder dieses Gelumpe mit VBS abfackeln. Also mit einem 20zeiligen VBSkript mit Fso.Objekt und TextStream und ReadAll rekursiv aus den in dem Ordner XY vorhandenen .d01-Dateien aus den gefundenen Strings "'SEQ+3+" und der danach folgenden nnnnnn-LfdNr diese ID ermitteln.
Wäre sinnvoll, wenn der Nummerkreis nicht näher eingrenzbat ist.
Beispiel: Wenn es nur 100 .d01-Dateien gibt, aber die enthaltenen Nummer vollkommen unbekannt sind, also im Bereich von 000001 bis 999999 versteut wären.

b) Batch-Alternative, falls der Nummernkreis eingrenzbarer ist.
Beispiel. Wenn du "weisst", dass die Nummern z.B. irgendwo im Bereich von 010500 bis 012000 liegen werden, dann tut es ein Oneliner vom CMD-Prompt aus auch
01.
>For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" e:\schnipsel\ma*.d01') do @echo %~nf: SEQ+3+0%a 
02.
matze01: SEQ+3+010571 
03.
matze02: SEQ+3+010575 
04.
matze04: SEQ+3+010577 
05.
matze117: SEQ+3+010603
Nur die erst zeile muss eingegeben werden (das ">" am Anfang NICHT).
Die anderen Zeilen sind Ausgabezeilen, die Dateinamen (ohne Endung) anzeigen, in denen ich diese lustigen Suchstrings verstecht habe.
Diese Testdateien entsprechen dem Beispielformat der .d01-Datei, die Du gepostet hast.

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
01.10.2009 um 20:51 Uhr
Hallo Biber,
hab das Skript jetzt auf meinen Pfad angepasst:

For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" c:\g4\*.d01') do @echo %~nf: SEQ+3+0%a

Und dann einmal mit " >> datei.txt "

For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" C:\G4\*.d01') do @echo %~nf: SEQ+3+0%a >> datei.txt

Aber es funktioniert nicht, es wird keine Datei angelegt. Und was für Suchstrings hast du versteckt

Zitat von Biber:
> Die anderen Zeilen sind Ausgabezeilen, die Dateinamen (ohne Endung)
anzeigen, in denen ich diese lustigen Suchstrings verstecht habe.



Schönen Abend noch

Gruß
Matze
Bitte warten ..
Mitglied: Biber
01.10.2009 um 21:11 Uhr
Moin matze-pe.

in der Musterdatei, die Du oben gepostet hast, sind die Suchstrings, die ich auch in der CMD-Zeile eingebaut habe
  • erstens als Präfix der String "'SEQ+3+0" wie nach dem FindStr zu sehen
  • und durch die FOR/L-Anweisung generieriert der zweite Teil des Suchstrings "10500", 10501",....."11000"

Die "matzexx.d01"-Dateien habe ich erzeugt als Kopie deiner geposteten Datei oben und nur den String "SEQ+3+0xxxxx" (der beispielweise in deiner Datei hier auftaucht
...:IN'QTY+131:1:PCE<b'SEQ+3+010575'</b>DTM+194:20090727 .....
...den habe ich auf den letzten 5 Stellen ersetzt durch "10571", "10577" etc statt "10575".

Und die Ausgabe habe ich mir nicht etwa aus dem Handgelenk geschüttelt, sondern von meinem Bildschirmboliden kopiert.

Bitte versuche es doch noch mal mit einer Kopie deiner geposteten Beispieldatei.

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
01.10.2009 um 21:26 Uhr
Moin Biber,
ich versteh das nicht

Meine eingefügte Beispieldatei, hab ich jetzt auch 6x kopiert, mit verschiedenen IDs

Liegen in meinem lokalen Ordner C:\G4

For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" C:\G4\*.d01') do @echo %~nf: SEQ+3+0%a


Wenn ich das Skript öffne, geht kurz die Konsole auf und schließt sich gleich wieder.
Wenn ich eine "Pause" am Ende einfüge schließt sich auch sofort das Fenster.

Aber ich erhalte keine Ausgabedatei.


Was mache ich denn falsch?


Gruß
Matze
Bitte warten ..
Mitglied: Biber
01.10.2009 um 21:42 Uhr
Moin matze-pe.

wie "wenn ich das Skript öffne, geht kurz die Konsole auf"?
Wo hab ich denn was von einem Skript erwähnt?
Und von wo "testest" Du??? Per Doppelklick vom Desktop?
Oder schickst Du das gleich vom Fernsehsessel aus via iPhone?

Na, geht mich auch nix an... ich mach mal für heute Schicht.

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
01.10.2009 um 21:49 Uhr
Hallo,
Skipt liegt in meinen lokalen Ordner.

Mein Anfangskript (erster Beitrag) wollte ich doch nur verbessert haben.
Bei dir hat das Skript doch auch geklappt.

Ich dachte das wäre das Skript^^


Hab erstmal schönen Dank


Könntest du mir dein ganzen Skript bitte einmal schicken.


Vielen Dank


gruß
Matze
Bitte warten ..
Mitglied: Biber
02.10.2009 um 09:29 Uhr
Moin matze-pe,

bitte teste am CMD-Prompt, indem Du folgende Zeile
01.
For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" C:\G4\*.d01') do @echo %~nf: SEQ+3+0%a
... per Copy & Paste zu einer Befehlszeile für den CMD-Interpreter machst.
Dann ENTER drücken und schauen, ob es das ist, was Du haben wolltest.

Danach kannst Du ein bisschen feintunen/an deine Bedürfnisse anpassen oder gar einen "Batch" daraus machen ("Batch" in Anführungszeichen, weil ein Skript, das aus einer Zeile besteht genau wie ein Science-Fiction-Roman, der aus einer Zeile besteht nicht von jedem anerkannt wird).

Anyway, als "Batch" müssen alle einfachen Prozentzeichen vor den FOR-Laufvariablen verdoppelt werden. d.h. aus einem "%a" wird "%%a" etc.
Steht aber auch in jeder besseren Online/Offline-Hilfe.

Viel Glück
Biber
Bitte warten ..
Mitglied: matze-pe
02.10.2009 um 12:52 Uhr
Super, vielen Dank hat geklappt.


Vielen Dank und schönes Wochenende





Gruß
Matze
Bitte warten ..
Mitglied: matze-pe
05.10.2009 um 14:38 Uhr
Hallo Biber,
habe den Thread zwar schon als "gelöst" markiert, habe aber trotzdem noch eine Frage:


Ich wollte jetzt in den Dateien nach einer weiteren Zahl suchen, die fängt im Jahr 2009 immer mit 09 an.
Hab dein Skript dazu angepasst, aber irgenwo hab ich noch ein Fehler drin.


Wäre klasse wenn du nochmal drüber schauen könntest:


For /L %%a in (10000,1,11000) AND %%b in (0900000000,1,2000000000) do @For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01') AND "delims=" %%g in('findstr /m ":VV+%%b:" C:\G4\*.d01')do @echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt


Gruß
Matze
Bitte warten ..
Mitglied: Biber
05.10.2009 um 15:22 Uhr
Moin matze-pe,

die FOR /L -Zählschleifen lassen sich nicht mit einem Schlüsselwort " AND " verknüpfen.

Die Syntax wäre viel banaler.... beide FOR/L-Anweisungen aneinanderreihen:

For /L %%a in (10000,1,11000) DO FOR /L %%b in (0900000000,1,2000000000) do @For /f "delims=" %%f in....

Im Batch kannst Du nach jedem ".... DO..." eine Klammer öffnen und eine neue Zeile beginnen, dann wird es unter Umständen übersichtlicher

01.
@For /L %%a in (10000,1,11000) DO @(  
02.
           FOR /L %%b in (0900000000,1,2000000000) do ( 
03.
                   For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01')  DO... 
04.
05.
06.
REM      ????        ... den Rest hier durchschaue ich nicht..            ???? 
07.
REM       ????          die beabsichtigte Logik hab ich nicht verstanden.   ???? 
08.
REM 
09.
 REM           AND "delims=" %%g in('findstr /m ":VV+%%b:" C:\G4\*.d01')do @echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt 
10.
 
Zum anderen: Es muss doch, wie und wo auch immer diese .d01-Dateien entstehen irgendwo einen abgreifbaren Zusammenhang zwischen dieser LfdNr [SEQ+...1nnnn] und dem Entstehungs(oder was-auch-immer-)jahr geben??

Ich meine, ich verstehe ja, dass Du (bzw. ein FindStr mit ein wenig Batch drumherum) in jede Datei reingucken muss, um zu "wissen", welche ID da drinsteht.
Aber das kann doch nicht sein, dass das "relevante Datum" von ID 14145 oder ID 17777 nun auch nur aus dem Inhalt dieser Datei zu ermitteln ist...
Bist Du sicher, dass Du es keine einfachere Strategie gibt?

Grüße
Biber
Bitte warten ..
Mitglied: matze-pe
05.10.2009 um 15:47 Uhr
Hallo Biber,
es hat den Hintergrund, die .d01 Dateien bekomme ich übermittelt, sie werden von einem anderen Programm dann verarbeitet.

Manchmal kommt es vor das die ID's in falscher Reihenfolge gesendet werden. ( die IDS müssen immer in richtiger reihenfolge übermittelt werden).

Bei auftreteten Fehler (falscge Reihenfolge) ist es dann einfacher, die direkten Dateien (d01) zu überprüfen. Es kann auch vorkommen das das Programm die Dateien in "falscher Reihenfolge" bearbeitet.

Somit ist es leichter, die direkten Dateien vorab schon zu überprüfen, mittels dem Batch


Hab die Klammern mal nach dem DO gesetzt:


For /L %%a in (10000,1,11000) DO
(
FOR /L %%b in (0900000000,1,2000000000) do
(
For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01') AND
"delims=" %%g in('findstr /m ":VV+%%b:" C:\G4\*.d01')do

(
echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt
)
)
)


Als abgespeicherte .bat Datei passiert garnichts, Fenster öffnet sich und schließt sich sofort, auch mit einem PAUSE drin.

Wenn ich das direket in CMD eingebe, bekomme ich die Fehlermeldungen

"%%a" ist syntaktisch an dieser Stelle nicht verarbeitbar.
"%%b" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Der Befehl ""delims="" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Mehr? echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt
Mehr? )


Weißt du da einen Rat?


Grüße
Matze
Bitte warten ..
Mitglied: matze-pe
07.10.2009 um 09:32 Uhr
Hallo Biber,
kannst du mir sagen wo hier drin der Fehler liegt, hab ja jetzt nach DO Klammern gesetzt:


For /L %%a in (10000,1,11000) DO
(
FOR /L %%b in (0900000000,1,2000000000) do
(
For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01') AND
"delims=" %%g in('findstr /m ":VV+%%b:" C:\G4\*.d01')do

(
echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt
)
)
)




Gruß
Matze
Bitte warten ..
Mitglied: matze-pe
07.10.2009 um 10:16 Uhr
Ohne den Klammern öffnet sich das Skript:


Hier das Skript ohne Klammern:

For /L %%a in (10000,1,11000) DO FOR /L %%b in (0900000000,1,2000000000) do @For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01') do AND "delims=" %%g in('findstr /m "%%b" C:\G4\*.d01') do @echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt



Als Ausgabe erhalte ich aber nur:


C:\G4>For /L %a in (10000 1 11000) DO FOR /L %b in (0900000000 1 2000000000) do
@For /F "delims=" %f in ('findstr /m "'SEQ+3+0%a'" C:\G4\*.d01') do AND "delims=
" %g in('findstr /m "%b" C:\G4\*.d01') do @echo %~nf.d01: SEQ+3+0%a %b 1>>c:\G4\
datei.txt

C:\G4>FOR /L %b in (0900000000 1 2000000000) do @For /F "delims=" %f in ('findst
r /m "'SEQ+3+010000'" C:\G4\*.d01') do AND "delims=" %g in('findstr /m "%b" C:\G
4\*.d01') do @echo %~nf.d01: SEQ+3+010000 %b 1>>c:\G4\datei.txt



Es werden keine Ergenisse abgespeichert.


Die Syntax für die 10 stellige Nummer ist doch richtig, oder?

Ein Beispiel dafür wäre:

VV+0931106511:
VV+0931106573:
VV+0931106559:

usw


Gruß
Matze
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...