einer batch-datei parameter aus einer textdatei übergeben
Hallo Admins/Mitglieder,
folgende Ausgangssituation
Ich habe eine Textdatei mit 20945 Zeilen
Jede Zeile ist als ein Datensatz zu interpretieren
Die Spalten sind durch Tabs getrennt
Ich möchte eine batch schreiben, die jeweils 3 Spalteneinträge aus jeder zeile der textdatei nimmt und hintereinader schreibt in eine neue textdatei. Und das eben 20945 mal.
Auszug der Textdatei:
1 19/ 8124 fuellstoff W CAD A
2 19/ 8115 HAB W CAD U
3 19/ 8125 fuellstoff W CAD A
4 19/ 7895 BIO I CAD A
5 19/ 8116 HAB W CAD A
6 19/ 8111 fuellstoff W CAD A
7 19/ 8110 fuellstoff W CAD A
8 19/ 8137 KC W CAD A
9 S 424 MMA S CAD U
10 S 449 KC F CAD A
11 19/ 8528 BMA L CAD A
12 19/ 8036 AUSSENAN B CAD A
...
Als Ergebnis soll diese Textdatei(Logdatei.txt) entsehen, die eigentlich batchbefehle enthält:
if exist y:\fuellstoff\a8124.* echo y:\fuellstoff\a8124.* > logdatei.txt
if exist y:\hab\a8116.* echo y:\hab\a8116.* > logdatei.txt
if exist y:\fuellstoff\a8111.* echo y:\fuellstoff\a8111.* > logdatei.txt
if exist y:\fuellstoff\a8124.* echo y:\fuellstoff\a8124.* > logdatei.txt
if exist y:\kc\a8137.* echo y:\kc\a8137.* > logdatei.txt
if exist y:\mma\u424.* echo y:\mma\u424.* > logdatei.txt
Man sieht, für mich sind nur spalte 3,4,7 wichtig, die ich auslesen möchte.
Da ich nicht richtig vertraut bin mit der nutzung von stapelverabtungsbefehlen bräuchte ich einen Ansatz.
Fazit:
Es soll zum Schluß eine Textdatei entstehen, die 20945 mal den Befehl in Form von:
if exist y:\........ echo y:\......... > logdatei.txt
beinhaltet und pro zeile ein befehl.
Danke
folgende Ausgangssituation
Ich habe eine Textdatei mit 20945 Zeilen
Jede Zeile ist als ein Datensatz zu interpretieren
Die Spalten sind durch Tabs getrennt
Ich möchte eine batch schreiben, die jeweils 3 Spalteneinträge aus jeder zeile der textdatei nimmt und hintereinader schreibt in eine neue textdatei. Und das eben 20945 mal.
Auszug der Textdatei:
1 19/ 8124 fuellstoff W CAD A
2 19/ 8115 HAB W CAD U
3 19/ 8125 fuellstoff W CAD A
4 19/ 7895 BIO I CAD A
5 19/ 8116 HAB W CAD A
6 19/ 8111 fuellstoff W CAD A
7 19/ 8110 fuellstoff W CAD A
8 19/ 8137 KC W CAD A
9 S 424 MMA S CAD U
10 S 449 KC F CAD A
11 19/ 8528 BMA L CAD A
12 19/ 8036 AUSSENAN B CAD A
...
Als Ergebnis soll diese Textdatei(Logdatei.txt) entsehen, die eigentlich batchbefehle enthält:
if exist y:\fuellstoff\a8124.* echo y:\fuellstoff\a8124.* > logdatei.txt
if exist y:\hab\a8116.* echo y:\hab\a8116.* > logdatei.txt
if exist y:\fuellstoff\a8111.* echo y:\fuellstoff\a8111.* > logdatei.txt
if exist y:\fuellstoff\a8124.* echo y:\fuellstoff\a8124.* > logdatei.txt
if exist y:\kc\a8137.* echo y:\kc\a8137.* > logdatei.txt
if exist y:\mma\u424.* echo y:\mma\u424.* > logdatei.txt
Man sieht, für mich sind nur spalte 3,4,7 wichtig, die ich auslesen möchte.
Da ich nicht richtig vertraut bin mit der nutzung von stapelverabtungsbefehlen bräuchte ich einen Ansatz.
Fazit:
Es soll zum Schluß eine Textdatei entstehen, die 20945 mal den Befehl in Form von:
if exist y:\........ echo y:\......... > logdatei.txt
beinhaltet und pro zeile ein befehl.
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 18572
Url: https://administrator.de/contentid/18572
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
20 Kommentare
Neuester Kommentar
Hi!
Dein Anliegen ist gar nicht soooo schwer......Das hab ich erst gestern noch gebraucht.
Du nimmst einfach eine FOR-Schleife:
for /F " tokens=3,4,7 " %%A IN (deinedatei.txt) DO (
if exist %%A(Parameter1) echo %%B(Parameter2) echo %%C(Parameter3) > logdatei.txt
)
Du kannst die einzelnen Token über %%A %%B und %%C (IN EINER BATCH) ansprechen und benutzen sowie du willst......Kannst auch andere Trenner definieren, wenn du hinter tokens=XXX noch ein delims=TRENNER schreibst.
Guck mal unter der Commandshell mit for /?
Soweit von mir. Greetz der onkel
Dein Anliegen ist gar nicht soooo schwer......Das hab ich erst gestern noch gebraucht.
Du nimmst einfach eine FOR-Schleife:
for /F " tokens=3,4,7 " %%A IN (deinedatei.txt) DO (
if exist %%A(Parameter1) echo %%B(Parameter2) echo %%C(Parameter3) > logdatei.txt
)
Du kannst die einzelnen Token über %%A %%B und %%C (IN EINER BATCH) ansprechen und benutzen sowie du willst......Kannst auch andere Trenner definieren, wenn du hinter tokens=XXX noch ein delims=TRENNER schreibst.
Guck mal unter der Commandshell mit for /?
Soweit von mir. Greetz der onkel
Moin rübensau,
HTH
Frank / der Biber aus Bremen
P.S. Was ist denn das für ein Nick? Bist Du Niedersachse??
::--------snipp Writebat.bat
@Echo off & setlocal
:: Delims ist ein Tab...kann auch weggelassen werden, da Default
::### uncomment if needed:### If exist batdatei.bat del batdatei.bat
for /f "tokens=3,4,7 delims= " %%a in (liste.txt) do (
echo if exist y:\%%a\%%c\%%b.* echo y:\%%a\%%c\%%b.* ^>^>Logdatei.txt>>batdatei.bat
)
::-------snapp Writebat.bat
HTH
Frank / der Biber aus Bremen
P.S. Was ist denn das für ein Nick? Bist Du Niedersachse??
@rübensau
dann google doch mal nach Rübensau-NRW..vielleicht ist der ja noch frei...
Back To Thread..
Ideen hätte ich schon noch ein oder zwei... aber ich würde gern vorher die Mimik / die Anforderung dahinter verstehen.
Ich sehe im Moment gar keinen Sinn in dieser 3-Dateien-Lösung.
Welchen sittlichen Nährwert hat denn das Erzeugen dieser Zwischen-Bat (die bei mir BatDatei.bat heißt)? Die ist doch überflüssig - oder hast Du von dem Rechner, wo Du die LogDatei.txt später brauchst, keinen Zugriff auf die Anfangsliste (diese TABbed-Datendatei)?
Erzähl doch bitte mal zwei Sätze zum Hintergrund. Nach dem, was ich bisher sehe, ist dieser Zwischenschritt nicht nötig. Und wem dient denn wiederum die LogDatei.txt als Input? Einem Kopier-/Backup-/Druckprogramm? Oder einem vierten Batch?
Neugierig
Frank / der Biber aus Bremen
dann google doch mal nach Rübensau-NRW..vielleicht ist der ja noch frei...
Back To Thread..
Ideen hätte ich schon noch ein oder zwei... aber ich würde gern vorher die Mimik / die Anforderung dahinter verstehen.
Ich sehe im Moment gar keinen Sinn in dieser 3-Dateien-Lösung.
Welchen sittlichen Nährwert hat denn das Erzeugen dieser Zwischen-Bat (die bei mir BatDatei.bat heißt)? Die ist doch überflüssig - oder hast Du von dem Rechner, wo Du die LogDatei.txt später brauchst, keinen Zugriff auf die Anfangsliste (diese TABbed-Datendatei)?
Erzähl doch bitte mal zwei Sätze zum Hintergrund. Nach dem, was ich bisher sehe, ist dieser Zwischenschritt nicht nötig. Und wem dient denn wiederum die LogDatei.txt als Input? Einem Kopier-/Backup-/Druckprogramm? Oder einem vierten Batch?
Neugierig
Frank / der Biber aus Bremen
Moin rübensau,
habe heute erst ziemlich spät noch mal reingeschaut ins Forum und Deine Antwort gelesen..
Werde wohl auch mich heute mehr Becks als Batchen widmen. *gg
Aber nochmal die Frage:
Findet das denn alles (der erste Batch zum reportdatei.log-Durchsuchen) und das Erzeugen der "tatsächlich_vorhandenen.log" auf EINEM Rechner oder auf verschiedenen, nicht verbundenen Rechnern statt?
Oder passiert das zeitlich versetzt, eine Woche später oder so?
Ich würde das ja sonst mit einem Batch und einer inneren FOR /R..IN..DO..-Schleife erledigen wollen.
::--------snipp Seek4Existing.bat ---ungetestete Skizze
@echo off & setlocal
:: Delims ist ein Tab...kann auch weggelassen werden, da Default
::### uncomment if needed:### If exist FoundLogDatei.log del FoundLogDatei.log
for /f "tokens=3,4,7 delims= " %%a in (liste.txt) do (
For /R y:\%%a\%%c\ %%@ in (%%b.*) do (
if exist %%@ echo %%~dpnx@>>FoundLogdatei.log
)
)
::-------snipp Seek4Existing.bat ---ungetestete Skizze
(die Zählvariable %%@ heißt nur so, damit ich die in dem drive-path-name-ext-Geraffel %%~dpnx@ wiederfinde. Undocumented, but beaverproofed.)
So, wie das Schreiben im Moment abläuft, würde der batch natürlich eine Datei
8110.xyz auch mehrmals in die FoundLogDatei.Log schreiben, wenn sie im Unterverzeichnis "y:\fuellstoff" und im Unterverzeichnis "y:\fuellstoff\VarianteB" gefunden wird. Ob das fachlich richtig ist/Sinn macht, kann ich nicht beurteilen.
HTH Biber
habe heute erst ziemlich spät noch mal reingeschaut ins Forum und Deine Antwort gelesen..
Werde wohl auch mich heute mehr Becks als Batchen widmen. *gg
Aber nochmal die Frage:
Findet das denn alles (der erste Batch zum reportdatei.log-Durchsuchen) und das Erzeugen der "tatsächlich_vorhandenen.log" auf EINEM Rechner oder auf verschiedenen, nicht verbundenen Rechnern statt?
Oder passiert das zeitlich versetzt, eine Woche später oder so?
Ich würde das ja sonst mit einem Batch und einer inneren FOR /R..IN..DO..-Schleife erledigen wollen.
::--------snipp Seek4Existing.bat ---ungetestete Skizze
@echo off & setlocal
:: Delims ist ein Tab...kann auch weggelassen werden, da Default
::### uncomment if needed:### If exist FoundLogDatei.log del FoundLogDatei.log
for /f "tokens=3,4,7 delims= " %%a in (liste.txt) do (
For /R y:\%%a\%%c\ %%@ in (%%b.*) do (
if exist %%@ echo %%~dpnx@>>FoundLogdatei.log
)
)
::-------snipp Seek4Existing.bat ---ungetestete Skizze
(die Zählvariable %%@ heißt nur so, damit ich die in dem drive-path-name-ext-Geraffel %%~dpnx@ wiederfinde. Undocumented, but beaverproofed.)
So, wie das Schreiben im Moment abläuft, würde der batch natürlich eine Datei
8110.xyz auch mehrmals in die FoundLogDatei.Log schreiben, wenn sie im Unterverzeichnis "y:\fuellstoff" und im Unterverzeichnis "y:\fuellstoff\VarianteB" gefunden wird. Ob das fachlich richtig ist/Sinn macht, kann ich nicht beurteilen.
HTH Biber
Moin rübensau,
Also, zwei Teilprobleme..
1.) die Nicht-gefundenen Dateien.. von denen willst Du ja nur wissen, wo Du sie gesucht hast.
Ich würde dafür aus der Zeile (in der FOR..IN..DO-Schleife)
dir c:\test\%%a\*%%b.* /s >nul 2>>FoundLogDatei.txt ...
...mehrere Zeilen machen ...beide Ausgaben von STDOUT und STDERR in die Tonne
...
FOR ....IN (liste.txt) DO (
dir c:\test\%%a\*%%b.* /b /s >nul: 2>&1
IF ERRORLEVEL 1 (
echo Keine Datei "*%%b.*" gefunden in c:\test\%%a\*%%b.*! >>%NotFoundLog%
)
)
...
Damit wäre zwar Problem 1 gelöst, aber für die "gefundenen" müsstest Du ein ein DIR aufrufen.. also doppelter Aufwand.
Also wäre nach wie vor mein Credo, beide Fälle über eine FOR /R ..IN..DO_Schleife abzuwickeln, die ist auch schneller als ein "DIR /s"
Also insgesamt...Problem 1 und 2:
FOR ...IN (liste.txt) DO (
For /R y:\%%a\ %%@ in (*%%b.*) do (
if exists %%@ (
echo %%~dpnx@>>FoundLogdatei.log
) ELSE (
echo Keine Datei "*%%b.*" gefunden in c:\test\%%a\*%%b.*! >>%NotFoundLog%
)
) )
Na, wenn das schon Probleme sind, dann hast du tatsächlich ein Problem
Grüße
Biber
P.S. Ist natürlich wie immer nur eine Skizze und ungetestet, aber vom Prinzip her sollte es laufen. Wenn immer noch nicht, dann leg ich mir mal am Wochenende so eine Degu$$a-Verzeichnisstruktur an und puhle die Tippfehler raus. Hoffe aber, dass Du schneller bist.
Also, zwei Teilprobleme..
1.) die Nicht-gefundenen Dateien.. von denen willst Du ja nur wissen, wo Du sie gesucht hast.
Ich würde dafür aus der Zeile (in der FOR..IN..DO-Schleife)
dir c:\test\%%a\*%%b.* /s >nul 2>>FoundLogDatei.txt ...
...mehrere Zeilen machen ...beide Ausgaben von STDOUT und STDERR in die Tonne
...
FOR ....IN (liste.txt) DO (
dir c:\test\%%a\*%%b.* /b /s >nul: 2>&1
IF ERRORLEVEL 1 (
echo Keine Datei "*%%b.*" gefunden in c:\test\%%a\*%%b.*! >>%NotFoundLog%
)
)
...
Damit wäre zwar Problem 1 gelöst, aber für die "gefundenen" müsstest Du ein ein DIR aufrufen.. also doppelter Aufwand.
Also wäre nach wie vor mein Credo, beide Fälle über eine FOR /R ..IN..DO_Schleife abzuwickeln, die ist auch schneller als ein "DIR /s"
Also insgesamt...Problem 1 und 2:
FOR ...IN (liste.txt) DO (
For /R y:\%%a\ %%@ in (*%%b.*) do (
if exists %%@ (
echo %%~dpnx@>>FoundLogdatei.log
) ELSE (
echo Keine Datei "*%%b.*" gefunden in c:\test\%%a\*%%b.*! >>%NotFoundLog%
)
) )
Und hast du noch Ideen zu meinen Problemen..
Grüße
Biber
P.S. Ist natürlich wie immer nur eine Skizze und ungetestet, aber vom Prinzip her sollte es laufen. Wenn immer noch nicht, dann leg ich mir mal am Wochenende so eine Degu$$a-Verzeichnisstruktur an und puhle die Tippfehler raus. Hoffe aber, dass Du schneller bist.
Moin rübensau,
die Standard-Delimiter sind TAB und Leerzeichen, solange Du keine anderen angibst.
Wenn Du nur TABs zulässt, musst Du noch einen Parameter "delims" angeben.
Getestetes Beispiel:
--Datei TabbedDelims.txt (mit TABs!)
BMA - 16 567465
BMA - 27 588888
--- end of Datei TabbedDelims.txt (mit TABs!)
~~~
::----Datei TabbedDelims.bat
@echo Off & setlocal
:: Delims ist ein TAB. Läßt sich NUR im Batch eingeben, nicht vom CMD-Prompt!!!
for /F "tokens=1,2 delims= " %%i in (TabbedDelims.txt) do echo i: [%%i] j: [%%j]
::---end of Datei TabbedDelims.bat
OutPut:
i: [BMA - 27] j: [588888]
~~
Sieht sonst doch aber prima aus! Bei dem Date-Time-Gehampel lies noch mal gelegentlich in meinem Batch-Tut III (Datums-und Zeitvariablen) rum.
Da bist Du halt nicht kompatibel/portabel bei verschiedenen Rechnern/OSen.
Grüße Biber
die Standard-Delimiter sind TAB und Leerzeichen, solange Du keine anderen angibst.
Wenn Du nur TABs zulässt, musst Du noch einen Parameter "delims" angeben.
Getestetes Beispiel:
--Datei TabbedDelims.txt (mit TABs!)
BMA - 16 567465
BMA - 27 588888
--- end of Datei TabbedDelims.txt (mit TABs!)
~~~
::----Datei TabbedDelims.bat
@echo Off & setlocal
:: Delims ist ein TAB. Läßt sich NUR im Batch eingeben, nicht vom CMD-Prompt!!!
for /F "tokens=1,2 delims= " %%i in (TabbedDelims.txt) do echo i: [%%i] j: [%%j]
::---end of Datei TabbedDelims.bat
OutPut:
TabbedDelims.Bat
i: [BMA - 16] j: [567465]i: [BMA - 27] j: [588888]
~~
Sieht sonst doch aber prima aus! Bei dem Date-Time-Gehampel lies noch mal gelegentlich in meinem Batch-Tut III (Datums-und Zeitvariablen) rum.
Da bist Du halt nicht kompatibel/portabel bei verschiedenen Rechnern/OSen.
Grüße Biber
Moin rübe,
das muss klappen, wenn als "Delims" ein Tabulatorzeichen angegeben ist.
for /F "tokens=1,2 delims=(TAB)" %%a in (test.txt) do ( ....
Wie letztes Mal geschrieben, TAB lässt sich nur via Editor eingeben (nicht vom CMD-Prompt)
So, wie der Output aussieht, wurde da kein TAB erkannt. Das Beispiel, dass ich letztes Mal gepostet habe, war aber wirklich getestet. Also evtl. ein Editor-Problem.
Sonst schick mir eine pn mit Deiner Mailadresse, wenn es gar nicht tun will.
Biber
das muss klappen, wenn als "Delims" ein Tabulatorzeichen angegeben ist.
for /F "tokens=1,2 delims=(TAB)" %%a in (test.txt) do ( ....
Wie letztes Mal geschrieben, TAB lässt sich nur via Editor eingeben (nicht vom CMD-Prompt)
So, wie der Output aussieht, wurde da kein TAB erkannt. Das Beispiel, dass ich letztes Mal gepostet habe, war aber wirklich getestet. Also evtl. ein Editor-Problem.
Sonst schick mir eine pn mit Deiner Mailadresse, wenn es gar nicht tun will.
Biber
Moin rübe,
...keine voreiligen Schlüsse.. er findet ja nichts
findstr /R %%a%%b %outpath%kompletter_dateipfad.txt >>found.log
Findstr mit Parameter /R sucht nicht etwa "Rekursiv", sondern nach einem "Regulären Ausdruck".
Nix gefunden = No Output --> mal Anzahl Schleifenelemente gleich 0 Byte in "found.log".
Works as designed.
Nimm statt dessen
findstr ohne /R oder findstr /i.
Schönen Nachmittag noch
Biber
obwohl er strings findet ist meine found.log immer leer
findstr /R %%a%%b %outpath%kompletter_dateipfad.txt >>found.log
Findstr mit Parameter /R sucht nicht etwa "Rekursiv", sondern nach einem "Regulären Ausdruck".
Nix gefunden = No Output --> mal Anzahl Schleifenelemente gleich 0 Byte in "found.log".
Works as designed.
Nimm statt dessen
findstr ohne /R oder findstr /i.
Schönen Nachmittag noch
Biber
Moin rübe,
langsam wird unübersichtlich in Deinen Zwischendateien..
Tasten wir uns mal ran:
$MyPrompt$for /f "tokens=6,*" %i in (19nrfoundlog4.txt) do @echo Token6=%j
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ACH\ach_scn\a1901253.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\w1901285.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\MMA\MMA_SCN\l1901305.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\w1901344.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ACH\ach_scn\w1901479.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901508.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901545.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\SK\SK_SCN\a1901566.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ARBVO\arbvo_scn\w1901577.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901592.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\k1901594.tif
Den Rest morgen.. essen wartet..sorry..
Biber
langsam wird unübersichtlich in Deinen Zwischendateien..
Tasten wir uns mal ran:
$MyPrompt$for /f "tokens=6,*" %i in (19nrfoundlog4.txt) do @echo Token6=%j
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ACH\ach_scn\a1901253.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\w1901285.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\MMA\MMA_SCN\l1901305.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\w1901344.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ACH\ach_scn\w1901479.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901508.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901545.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\SK\SK_SCN\a1901566.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\ARBVO\arbvo_scn\w1901577.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\l1901592.tif
Token6=\\wesdata2.wesnet.degussanet.com\ta-cad\AUSSENAN\AANL_SCN\k1901594.tif
Den Rest morgen.. essen wartet..sorry..
Biber