findstr findet falschen Datensatz

wolfo

Cadet 3rd Year
Registriert
März 2007
Beiträge
33
vorweg: es sind meine ersten Gehversuche in dieser Materie.....


for /f "tokens=1 delims==" %%s in ('findstr /r /c:"%Treffer1%" "%Textdatei2%"') do set "Treffer2=%%s"

%Treffer1% wird (ein paar Zeilen vorher) richtig erkannt als : gdaq1

Inhalt Textdatei2:
1: gdaq1 zaxt5 sample text1a1 name1 irgendwas 16.10.23
2: gdaq2 kdhfg sample text1a2 name2 irgendeinname 16.10.23
.
.
.
10: gdaq10 fjghreio sample text2a2 auchirgendwas 02.11.23

for /f... wirft immer als Treffer2 "10: gdaq10 fjghreio sample text2a2 auchirgendwas 02.11.23" aus

-> wie kann ich besser eingrenzen, damit NUR die Zeile 1:... ausgegeben wird?
 
Was ist der Zweck?
Die Windows-Alternative zu grep ist laut Internetsuche Select-String.
Muss es denn batch sein?

Edit: Und falls es Batch sein muss, kannst du dann deine Testskripte hier hochladen? Vielleicht benötigst du auch EnableDelayedExpansion, und dann !Treffer1! statt %Treffer1%.

Edit2:
Entschuldige, und ignoriere meine bisherige Antwort. Laut Hilfe hast du mit /r einen regulären Ausdruck. Außerdem ist dein Problem ja nur, dass Zeile 10 ebenfalls erkannt wird. Im dargestellten Fall kannst du einfach den Suchstring ändern. Und zwar auf "gdaq1 " (mit Leerzeichen hinten dran.) Geht natürlich mit RegEx auch mit mehr Kontrolle für weitere Szenarien, bspw. wenn "gdaq1" am Zeilenende steht und ebenfalls erkannt werden soll.
 
Zuletzt bearbeitet:
Zweck ist aus einer Textdatei mit allen Logins den zum jeweiligen Login zugehörigen Namen zu finden
jo, wenn irgendwie möglich soll es batch bleiben, ich hab schon zuviel Energie reigesteckt in weiteren "Suchroutinen"
Ergänzung ()

seh gerade.... Powershell ginge natürlich auch + wäre bestimmt sinnvoller für diesen Zweck
 
Genau, mit Powershell kannst du auch bisherige .bat Skripte weiternutzen. Und zusätzlich ist es mächtiger (und moderner) als CMD/Batch.

Was sind die genauen Anforderungen an deinen Suchstring? Ist das immer die gleiche Buchstabenfolge ("gdaq") gefolgt von einer Zahl? Falls das Leerzeichen danach nicht praktikabel ist, könntest du so Dinge machen wie anschließende Ziffern auszuschießen. Müsste dann:
Code:
gdaq1[^0-9]
als Suchausdruck sein. Das Zirkumflex negiert. Die eckigen Klammern machen ein Set, in dem Fall von Ziffern.
 
die Liste enthält zufällige User/Pass kombinationen gefolgt von eine Beschreibung
also nicht immer kommt eine Zahl drin vor

1: gdaq1 zaxt5 sample text1a1 name1 irgendwas 16.10.23
2: gdaq2 kdhfg sample text1a2 name2 irgendeinname 16.10.23
10: gdaq10 fjghreio sample text2a2 auchirgendwas 02.11.23

in diesem Fall kommt einmal gdaq1 und gdaq10 vor, dass ich mit findstr nicht trennen kann - es wird immer gdaq10 erkannt. In der Batch wird "user" (in dem Fall gdaq1 aus einer weiteren Datei richtig erkannt, beim "Finden in der liste.txt aber falsch zugeordnet.
kann ich in der Batch einfach weitermachen: mit Powershell Select-String und %Treffer1% (der ja richtig ist) übergeben?
Ergänzung ()

bin schon mal soweit:
powershell select-string -pattern %Treffer1% C:\tmp\Textdatei2.txt
es wird aber immer noch Zeile 1:... UND Zeile 10:... ausgegeben

wie kann ich das noch einschränken?
es soll ja bei der Suche nach gdaq10 ebenfalls die entsprechende Zeile ausgegeben werden
evtl. and %Treffer1% noch ein Leerzeichen anhängen?

also zwische User und Pass kommt immer ein! Leerzeichen
 
Zuletzt bearbeitet:
Hmm, sieht nach Zeile mit Treffer finden, Zeile zerlegen und 2. Element mit Treffer vergleichen und bei Erfolg in neue Variable.

Also for Loop Inception:

Code:
for /f "tokens=* delims=" %%s in ('findstr /r /c:"%Treffer1%" "%Textdatei2%"') do (
    set "TTreffer=%%s"
    for /f "tokens=1,2,3,4* delims= " %%A in ("!TTreffer!") do if "%Treffer1%"=="%%B" set "Treffer2=!TTreffer!"
)

Versuch macht kluch...oder so :).
 
in dem Fall muss ich
echo %Treffer2% ausgeben lassen - da kommt aber nix - hab ich noch was übersehen?
 
super erstmal ein fettes Danke! vorab
 
  • Gefällt mir
Reaktionen: s1ave77
Gerade mal mit deinen Angaben eine Testdatei zum durchsuchen gebaut und versucht.

TTreffer geht durch 2 Versuche und gibt hier die 1. Zeile aus und ignoriert 10.

ist:
Code:
setlocal EnableExtensions
setlocal EnableDelayedExpansion
am Anfang des Skriptes gesetzt??

TXT:
Code:
1: gdaq1 zaxt5 sample text1a1 name1 irgendwas 16.10.23
2: gdaq2 kdhfg sample text1a2 name2 irgendeinname 16.10.23
3: gdaq3 kdhfg sample text1a2 name2 irgendeinname 16.10.23
4: gdaq4 kdhfg sample text1a2 name2 irgendeinname 16.10.23
5: gdaq5 kdhfg sample text1a2 name2 irgendeinname 16.10.23
6: gdaq6 kdhfg sample text1a2 name2 irgendeinname 16.10.23
10: gdaq10 fjghreio sample text2a2 auchirgendwas 02.11.23

Skript:
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "Textdatei2=test.txt"
set "Treffer1=gdaq1"
for /f "tokens=* delims=" %%s in ('findstr /r /c:"%Treffer1%" "%Textdatei2%"') do (
    set "TTreffer=%%s"
    for /f "tokens=1,2,3,4* delims= " %%A in ("!TTreffer!") do if "%Treffer1%"=="%%B" set "Treffer2=%%s"
)
echo %Treffer2%
pause

Ergebnis:
Code:
1: gdaq1 zaxt5 sample text1a1 name1 irgendwas 16.10.23
Drücken Sie eine beliebige Taste . . .
 
  • Gefällt mir
Reaktionen: wolfo
wolfo schrieb:
evtl. and %Treffer1% noch ein Leerzeichen anhängen?
Würde ich testen. Hab ich ja auch im 2. Edit in meiner ersten Antwort geschrieben, weiß nicht, ob du das noch gesehen hast.
 
  • Gefällt mir
Reaktionen: wolfo
jetzt geeehts - :-)
auch der Datensatz mit ...10 wird exact gefunden
die beiden setlocal fehlten auch - bin halt zumindest in dieser Materie blutiger Anfänger...
Danke für die prompte Hilfe!
 
  • Gefällt mir
Reaktionen: simpsonsfan und s1ave77
Dieses EnableDelayedExpansion (also, dass das nötig ist) ist halt auch eine Eigenart von Batch, die mit ein Grund dafür ist, eher eine andere Skriptsprache, z.B. Powershell zu verwenden. Insbesondere, wenn man eh gerade anfängt.
 
  • Gefällt mir
Reaktionen: wolfo
mist, hab auch folgende Datensätze in Textdatei2:
irgenduser001 Name 15.11.23
hier steht kein pass dabei
die findet er jetzt nicht mehr - muss ich hier noch was an den Delims ändern?
 
also solche Zeilen wie:
irgenduser001 Name 15.11.23
irgenduser002 Name1 Name2 11.12.23
das geht hoch bis 200 sonst aber immer gleich
 
Code:
set "Textdatei2=test.txt"
set "Treffer1=gdaq1"
for /f "tokens=* delims=" %%s in ('findstr /r /c:"%Treffer1% " "%Textdatei2%"') do (
    echo %%s
)
Ergänzung ()

Oder, wie schon gesagt, RegEx auch verwenden.
Code:
set "Textdatei2=test.txt"
set "Treffer1=gdaq1"
for /f "tokens=* delims=" %%s in ('findstr /r /c:"%Treffer1%[^0-9]" "%Textdatei2%"') do (
    echo %%s
)
 
  • Gefällt mir
Reaktionen: wolfo und s1ave77
Ja, auch gerade getestet, findstring will nicht nach Teilen eines Stringes suchen, ohne Verwandschaften mitzunehmen.

Da hilft echt nur das Leerzeichen, wie über mir gezeigt.
 
  • Gefällt mir
Reaktionen: wolfo
jetzt gehen alle!
[^0-9] das ist die Lösung für mich
ihr seid oberste Liga!
nochmals vielen Dank!
 

Ähnliche Themen

Antworten
3
Aufrufe
1.630
Zurück
Oben