connecthor
Goto Top

Bestimmten gefundenen Wert aus txt verarbeiten

Hallo,

Biber und LotPings wissen bestimmt schnell rat.

for /f "tokens=1* delims==" %%i in ('findstr /i /b "path=" "%ini%"') do set "js=%%j"  

jetzt fehlt mir die einstellung, dass er den ERSTEN gefundenen wert weiterverarbeitet. Wie folgt.

for /f "usebackq delims=" %%k in ("%Datei%") do set "Line=%%k" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"  

dann soll er den nächsten wert genauso bearbeiten.

zur schnelleren bearbeitung würde ich denke, dass noch eine abfrage ala

'findstr /i /b "%von%" "%js%"'  

bei mir nimmt er zur zeit leider nur die LETZTE gefundene zeile (wenn nur eine gefunden wird nimmt er natürlich die)

ihr könnt bestimmt helfen

DANKE

Content-ID: 144191

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

Biber
Biber 04.06.2010 um 17:34:42 Uhr
Goto Top
Moin connecthor,

im Prinzip hast du schon alles richtig, nur sollen ALLE Anweisungen, die in deiner zweiten Zeile nach dem FOR-Anweisungs-DO folgen
für jedes Element/jede Zeile angewandt werden. Also musst du diese in Klammern setzen.

Demo am CMD-Prompt:
> rem die inputdatei sieht so aus.
>type x.txt
path=d:\temp
path=f:\temp
path=d:\temp\backup

> Rem Setzen der Von/nach-Variablen
> set "von=temp" & set "nach=another"

>for /f "usebackq delims=" %k in (x.txt) do @(set "Line=%k" & set Line=!Line:%Von%=%Nach%! & @echo !Line!)
path=d:\another
path=f:\another
path=d:\another\backup

Ich denke, der Unterschied zu deiner 2.Zeile (also die Einklammerung) ist erkennbar.
Die "@"-Zeichen sind bedeutungslos ... ist nur zur Echo-unterdrückung am Prompt.

Grüße
Biber
77559
77559 04.06.2010 um 20:19:46 Uhr
Goto Top
Zitat von @connecthor:
Biber und LotPings wissen bestimmt schnell rat.
Nicht so ganz, ich finde ja toll was Biber da interpreiert hat, aber

for /f "tokens=1* delims==" %%i in ('findstr /i /b "path=" "%ini%"') do set "js=%%j"   
jetzt fehlt mir die einstellung, dass er den ERSTEN gefundenen wert weiterverarbeitet. Wie folgt.
meinst du jetzt das du hier NUR den ersten gefundenen Wert bearbeiten willst?
for /f "usebackq delims=" %%k in ("%Datei%") do set "Line=%%k" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"  
dann soll er den nächsten wert genauso bearbeiten.
Hier fehlt mir der Zusammenhang und vor allem ein Ist-Soll-Vergleich der Eingangsdaten.
zur schnelleren bearbeitung würde ich denke, dass noch eine abfrage ala
 'findstr /i /b "%von%" "%js%"'  
bei mir nimmt er zur zeit leider nur die LETZTE gefundene zeile (wenn nur eine gefunden wird nimmt er natürlich die)
ihr könnt bestimmt helfen
Vielleicht hat Biber das ja schon getan face-wink

Falls du nur den ersten von mehreren möglichen Werten berabeiten willst:
Set "js=" 2>NUL  
for /f "tokens=1* delims==" %%i in ('findstr /i /b "path=" "%ini%"') do If not defined js set "js=%%j"   

Gruß
LotPings
connecthor
connecthor 07.06.2010 um 21:43:26 Uhr
Goto Top
Nabend,

@Biber:

das blöde ist, dass der "path=" per zufall generierte werte enthält. diese also nicht statisch zugewiesen werden können...

@77559:

so weit gehts... PRIMA, DANKE!!! Was muss ich aber machen, damit entweder ALLE "path=" verzeichnisse oder nur der Xte bearbeitet werden???

es ist doch bestimmt möglich, mehrere aufgaben mit einem & zu verknüpfen, so wie:

for /f "tokens=1* delims==" %%i in ('findstr /i /b "path=" "%ini%"') do If not defined js set "js=%%j" & do rd "%%j\maildir" /S /Q 2>nul & do rd h:\maildir_old /S /Q

????

vielen dank im vorraus für eure hilfe
77559
77559 07.06.2010 um 21:59:25 Uhr
Goto Top
dto, schönen Abend,

deine Anforderungen sind ja ganz schön variabel.
Das mit dem & ist kein Problem, kannst du aber einfach ausprobieren.
Wenn du Alle willst pack die Befehle in zus. Klammern oder eine Subroutine.

Wenn du z.Bsp. nur den 3. willst, brauchst du einen Zähler, und für den brauchst du Delayed Expansion oder eine Subroutine.

@Echo off & Setlocal EnableDelayedExpansion
Set X=0
for /f "tokens=1* delims==" %%i in ('findstr /i /b "path=" "%ini%"') do Set /A "X+=1"& If !X! EQU 3 set "js=%%j"  

Gruß
LotPings
connecthor
connecthor 07.06.2010 um 23:07:49 Uhr
Goto Top
hallo LotPings,

das mit den "zus. klammern" versteh ich gerade nicht... wahrscheinlich weil meine frau gerade in den wehen liegt und ich in kürze vater sein werde...

könntest du mir ein kurzes beispiel geben?!?!?

mit ALLE meinte ich, dass er ALLE pfade die er in der %ini% findet nacheinander durchgeht und das ersetzen durchführt...


danke
77559
77559 07.06.2010 um 23:16:09 Uhr
Goto Top
Na dann beeile ich mich wohl besser face-wink

Dein 2. Beispiel ganz oben könntest du auch so schreiben:
for /f "usebackq delims=" %%k in ("%Datei%") do (  
  set "Line=%%k"  
  set Line=!Line:%Von%=%Nach%! 
  echo !Line!>>"%t%"  
)

Alles Gute!

LotPings
connecthor
connecthor 09.06.2010 um 10:22:34 Uhr
Goto Top
Mahlzeit!!! face-wink

so, da issa dann stolzer vater eines gesunden jungen... face-big-smile

da habe ich zwischen windeln und scheien ein paar minuten zeit das mal zu testen.

schönen dank im vorraus!!!
Biber
Biber 09.06.2010 um 19:16:32 Uhr
Goto Top
Moin connecthor,

Zitat von @connecthor:
Mahlzeit!!! face-wink

so, da issa dann stolzer vater eines gesunden jungen... face-big-smile
Herzlichen Glückwunsch!
...war es denn sehr anstrengend für dich...?? *fg

da habe ich zwischen windeln und scheien ein paar minuten zeit das mal zu testen.
Da fehlt ein Buchstabe .... nein, ich möchte nicht raten, wo und welcher...

schönen dank im vorraus!!!
Dafür ist hier einer zuviel...

Egal, wenn du schon bei einem einzigen Kiddie so durch den Wind bist, dass du dich für eine bereits gepostete Lösung und/oder dein Testen derselben im Voraus bedankst...

fang lieber erstmal keine Folgeprojekte an...*gg

Grüße
Biber
connecthor
connecthor 12.06.2010 um 12:47:55 Uhr
Goto Top
guten tag, morgen, abend oder was auch immer gerade ist... face-wink

das mir der rechtschreibung tut mir ein wenig leid, ich könnte es auf die tastatur schieben, die nämlich voller wasser face-wink

zum glück ist das schreiben keine batch und erst recht kein linux... sonst wär ich bei dem verschwommenen bild wohl zum virenschreiber geworden.

vielen dank BIBER für die glückwünsche... und JA, es war anstrengend!!! außer in braveheart und apocalypto hab ich noch nicht SO viel blut gesehen... da hatte ich lange keinen hunger mehr ...

noch kurz ne frage... wo finde ich ne übersicht über die strings von FOR ? ich verwende immer %i du hast bei deinem letzten tipp %k verwendet... wo liegt der unterschied?
kkboy94
kkboy94 12.06.2010 um 22:16:00 Uhr
Goto Top
Hallo connecthor
Herzlichen Glückwunsch auch von mir face-wink


noch kurz ne frage... wo finde ich ne übersicht über die strings von FOR ? ich verwende immer %i du hast bei deinem
letzten tipp %k verwendet... wo liegt der unterschied?
Ich persönlich kenn den Unterschied zwar jetzt nicht aber ich vermute mal, dass du bei der kommandozeilenhilfe fündig wirst.
also cmd aufrufen for /? eingeben
und dann sollte da vielleicht ne Liste kommen.

Aber wie gesagt, ich bin mir nicht sicher.

MfG Karsten
Biber
Biber 13.06.2010 um 15:39:19 Uhr
Goto Top
Moin connecthor,

Zitat von @connecthor:
guten tag, morgen, abend oder was auch immer gerade ist... face-wink
Das wird für dich als junger Vater in der Einarbeitung auch die nächsten paar Monate keinen grossen Unterschied machen...*gg

noch kurz ne frage... wo finde ich ne übersicht über die strings von FOR ?
Hat kkboy94 treffsicher beantwortet..
ich verwende immer %i du hast bei deinem letzten tipp %k verwendet... wo liegt der unterschied?
Wie du die Laufvariable nennst, ist im Rahmen der 58 möglichen Zeichen vollkommen beliebig.
Erlaubt und dokumentiert sind a-z und A-Z.

Einige Batch-Schroter lassen die Zählvariablen mit %a, %b %c.. beginnen für das erste, zweite, dritte... Token.
Andere haben Präferenzen für %x, %y, %z
Andere verwenden Grossbuchstaben %A, %B, %C ..
Andere (so wie ich) verwenden %i, %j .... weil Zähler in anderen Skript-Sprachen meist so benamst werden.
Bei einem Variablennamen "i" weiss jeder Coder: "Aha, ist eine FOR/LOOP/Whatever-Zählvariable".

Dass ich hier mal %k fürs erste anzusprechende Token verwendet habe --> hatte keine tiefer gehende Bedeutung.

Grüße
Biber
77559
77559 14.06.2010 um 13:44:11 Uhr
Goto Top
Zitat von @Biber:
@connecthor: Auch von mir einen herzlichen Glückwunsch und ich wünsche dir gute Nerven face-wink

Wie du die Laufvariable nennst, ist im Rahmen der 58 möglichen Zeichen vollkommen beliebig.
Erlaubt und dokumentiert sind a-z und A-Z.
Möglich sind darüber hinaus etliche weitere (Sonder-)Zeichen und auch alle Ziffern - empfehlen kann man deren Verwendung aber nur wenn man die (meiner Erfahrung nach) längst mögliche Sequenz von 31 tokens bei einem for /f auswerten möchte.
Ohne Verrenkungen wie Escapen gibt es nur diese eine Folge: ?@ABC...XYZ[\] die das ermöglicht.

Diese Datei Test.txt
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132
Ausgewertet mit dieser Batch
@Echo off
for /f "tokens=1-31 delims=," %%? in (test.txt) do (  
Echo %%? %%@ %%A %%B %%C
Echo %%D %%E %%F %%G %%H
Echo %%I %%J %%K %%L %%M
Echo %%N %%O %%P %%Q %%R
Echo %%S %%T %%U %%V %%W
Echo %%X %%Y %%Z %%[ %%\
Echo %%]
Echo ==============================)
erzeugt diese Ausgabe:
>For-Tokens.cmd
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31
==============================
101 102 103 104 105
106 107 108 109 110
111 112 113 114 115
116 117 118 119 120
121 122 123 124 125
126 127 128 129 130
131
==============================

Gruß
LotPings
Biber
Biber 14.06.2010 um 15:48:59 Uhr
Goto Top
Moin Lotpings,

in der Tat, es snd dann mehr als 58 mögliche Zeichen - die Variante mit den Ziffern kannte ich auch noch nicht.

Also sind ohne Maskierung möglich
  • A-Z, a-Z ---------> 2x26 = 52 Zeichen
  • 0-9 ---------> 10 Zeichen
  • @, !, ?, _, ], [ , }, {, /, \ ----> 10 Zeichen
  • + ein paar Exoten/Maskierte

roundabout 75 mögliche Zeichen.
Aber eben maximal 31 Token pro Zeile.

Grüße
Biber
connecthor
connecthor 21.06.2010 um 07:22:27 Uhr
Goto Top
guten morgen,

vielen dank für eure glückwünsche.
die nerven habe ich mir schon im laufe der jahre mit meinen "schäfchen" gestärkt. da sind die paar nächtlichen schreiattacken die reinste erholung...

eure erklärungen sind sehr umfang und aufschlussreich. dafür auch noch mal danke.

ich werde mich dann mal heute nach fast 2 wochen "babypause" wieder dem tagesgeschäft zuwenden und testen testen testen.

grüße

Connecthor
connecthor
connecthor 26.06.2010 um 10:13:27 Uhr
Goto Top
hallo, also nach umfangreichen tests...

es geht nicht face-sad

die INI datei sieht so aus:

einstellungen
wo
das mail liegt
path=C:\email\xxxxx.default

einstellungen
wo
das mail2 liegt
path=d:\email\yyyyyy.default

einstellungen
wo
das mail3 liegt
path=e:\email\zzzzzzz.default

pfad sieht folgendermaßen aus:

Email
|_ xxxxxx.default
| |_ prefs.js
|
|_ yyyyyy.default
|_ prefs.js ....

ich möchte die pfade aus der INI datei auslesen und in ALLEN gefundenen pfaden, in den prefs.js dateien den wert %von% nach %nach% setzten.

also in jeder.

nicht nur in der ersten oder letzten.

bitte um hilfe!!!
77559
77559 29.06.2010 um 21:01:59 Uhr
Goto Top
Hallo,

mit Verspätung, versuch mal dies (ungetestet)
@Echo off
Setlocal EnableDelayedExpansion
Set IniFile="d:\test\test.ini"  
For /f "UseBackQ Tokens=1,* Delims==" %%A in (%IniFile%) Do Call :ProcessFile "%%B\prefs.js"  
Goto :Eof
:ProcessFile
If Not Exist %1 Echo Nicht gefunden: %1 & Goto :Eof
Set "PrefNew=%~dpn1.NEW"  
Type NUL >"%PrefNEW%"  
for /f "usebackq delims=" %%k in (%1  
 ) do set "L=%%k" & set "L=!L:%Von%=%Nach%!"& >>"%PrefNEW%" echo.!L!  
 

Gruß
LotPings
einige Fehlerchen inzwischen beseitigt
PS: Von und Nach musst du natürlich noch Irgendwo definieren
connecthor
connecthor 05.07.2010 um 07:18:57 Uhr
Goto Top
guten morgen.

ähmm... geht nicht. und aufgrund der länge und übersichtlichkeit fange ich mal einen neuen thread an.

danke bis hierher

connecthor