Batch Suchmaschine, Zeichen die hinter dem gesuchtem Wert stehen übermitteln
Suchmaschine, Wert übermitteln der rechts neben dem gesuchtem steht.
hallo zusm,
ich habe mir mit meinen noch kleinen Batch Kenntnissen mal eine Suchmaschine zusm kopiert :P
funktioniert soweit auch.
Diese Batch sucht in einer txt nach einem Wort was man eingibt.
Ich möchte das der text der rechts neben dem gesuchtem Wort steht über echo ganz normal angezeigt wird.
z.B. das steht in der txt :
Name Nachname
Straße Hausnummer
wenn ich dann nach Name suche soll Nachname über echo angezeigt werden.
Wenn das gesuchte mehrmals gefunden worden ist soll alles was je rechts daneben steht angezeigt werden.
Das ist das Batch Skript:
@echo off
echo Was suchen sie ?
set /p "s=Bitte eingeben: "
@for /f "Tokens=3,*" %%a in ('find /I /C "%s%" c:\Liste.txt^') do @set T=%%a
@if "%T%" LSS "1" goto Exit
@goTo JA
:Exit
@echo.
@echo %s% wurde nicht gefunden
@echo.
@pause
exit
:JA
@echo.
@echo Der %s% wurde %T% mal gefunden
@echo.
@echo juhuuu,der Test geht
@echo.
@pause
Geht doch bestimmt irgendwie
Wenn jemand eine mögliche Lösung weiß, bitte posten
Ach und könnt ihr dann erklären was ihr da gemacht habt, ich versuche nämlich gerade Batch zu lernen.
Danke euch !
greez
hallo zusm,
ich habe mir mit meinen noch kleinen Batch Kenntnissen mal eine Suchmaschine zusm kopiert :P
funktioniert soweit auch.
Diese Batch sucht in einer txt nach einem Wort was man eingibt.
Ich möchte das der text der rechts neben dem gesuchtem Wort steht über echo ganz normal angezeigt wird.
z.B. das steht in der txt :
Name Nachname
Straße Hausnummer
wenn ich dann nach Name suche soll Nachname über echo angezeigt werden.
Wenn das gesuchte mehrmals gefunden worden ist soll alles was je rechts daneben steht angezeigt werden.
Das ist das Batch Skript:
@echo off
echo Was suchen sie ?
set /p "s=Bitte eingeben: "
@for /f "Tokens=3,*" %%a in ('find /I /C "%s%" c:\Liste.txt^') do @set T=%%a
@if "%T%" LSS "1" goto Exit
@goTo JA
:Exit
@echo.
@echo %s% wurde nicht gefunden
@echo.
@pause
exit
:JA
@echo.
@echo Der %s% wurde %T% mal gefunden
@echo.
@echo juhuuu,der Test geht
@echo.
@pause
Geht doch bestimmt irgendwie
Wenn jemand eine mögliche Lösung weiß, bitte posten
Ach und könnt ihr dann erklären was ihr da gemacht habt, ich versuche nämlich gerade Batch zu lernen.
Danke euch !
greez
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 170176
Url: https://administrator.de/contentid/170176
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo carp-catcher,
tjaaaaa, also diese Aufgabe per Batchscript lösen ist murks. Ich hätte da was in VBScript:
Das Script z.B. als
Grob zum Algorithmus:
Die Anzahl der Fundstellen erhält man mit
Wenn Du jetzt stöhnst , tut mir leid, für sowas nehme ich kein Batchscript, viel zu umständlich. Es ist auf jeden Fall sinnvoll, VBScript zu lernen, gerade wenn es um das verarbeiten von Dateiinhalten geht, da hat Batchscript große Schwächen.
Hier gibt es eine Sprachreferenz zu VBScript in deutsch, der Link ist das
Gruß
Friemler
tjaaaaa, also diese Aufgabe per Batchscript lösen ist murks. Ich hätte da was in VBScript:
Const ForReading = 1
If WScript.Arguments.Count > 1 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
strContent = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False).ReadAll
Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.IgnoreCase = False
objRegExp.Pattern = "(\b" & WScript.Arguments(1) & "\b)\s(\b[^\s]*\b)"
For Each objMatch In objRegExp.Execute(strContent)
WScript.Echo objMatch.SubMatches(1)
Next
End If
Das Script z.B. als
Search.vbs
speichern. Aufruf:cscript /nologo Search.vbs "DateiInDerGesuchtWerdenSoll" "Begriff"
Grob zum Algorithmus:
- In Zeile 5 wird der Inhalt der Datei, deren Name und Pfad im ersten Parameter (Zugriff über
WScript.Arguments(0)
) übergeben wurde, komplett in eine Stringvariable eingelesen. - Danach wird ein Objekt für Reguläre Ausdrücke erzeugt.
- Durch das Setzen der
Global
-Eigenschaft auf True wird eingestellt, dass alle Stellen gefunden werden sollen, an denen der gesuchte reguläre Ausdruck auftritt, nicht nur die erste Stelle. - Mit der
IgnoreCase
-Eigenschaft wird das Ignorieren von Groß-/Kleinschreibung gesteuert, hier soll sie also nicht ignoriert werden. - Die Eigenschaft
Pattern
beschreibt das Suchmuster. - In Klammern gesetzte Ausdrücke ergeben im Ergebnis sog. Submatches
\b
bedeutet Wortgrenze- Dann kommt der als zweiter Parameter übergebene Begriff (
WScript.Arguments(1)
) - Danach wieder eine Wortgrenze (
\b
) - Die schließende Klammer, um den ersten Submatch abzuschließen
- Dann ein Freizeichen (Space oder Tab),
\s
- Öffnende Klammer, Beginn eines neuen Submatches
- Eine Wortgrenze,
\b
- Eine Klasse von Zeichen, die alles außer Freizeichen enthält
[^\s]
- Ein Zeichen aus dieser Zeichenklasse beliebig oft,
*
- Eine Wortgrenze,
\b
- Die schließende Klammer, um den zweiten Submatch abzuschließen
- Die
For
-Schleife in Zeile 12 iteriert durch alle vom Aufruf der MethodeExecute
gefundenen Treffer. Jeder Treffer/Match enthält immer zwei Submatches. Der erste Submatch mit dem Index 0 enthält den gesuchten Begriff und interessiert nicht, deshalb wird nur der zweite Submatch mit dem Index 1 in Zeile 13 ausgegeben.
Die Anzahl der Fundstellen erhält man mit
Set colMatches = objRegExp.Execute(strContent)
WScript.Echo colMatches.Count & " Fundstellen."
For Each objMatch In colMatches
WScript.Echo objMatch.SubMatches(1)
Next
Wenn Du jetzt stöhnst , tut mir leid, für sowas nehme ich kein Batchscript, viel zu umständlich. Es ist auf jeden Fall sinnvoll, VBScript zu lernen, gerade wenn es um das verarbeiten von Dateiinhalten geht, da hat Batchscript große Schwächen.
Hier gibt es eine Sprachreferenz zu VBScript in deutsch, der Link ist das
script56.chm
unter der fetten Überschrift Microsoft Windows Script-Technologien - Hilfe.Gruß
Friemler
Zitat von @carp-catcher:
kann die vbs datei die daten einfach so an die batch datei übermitteln?
...
ich weiß jetzt nicht wo ich diese Zeile einsetzten soll
kann die vbs datei die daten einfach so an die batch datei übermitteln?
...
ich weiß jetzt nicht wo ich diese Zeile einsetzten soll
Am besten als Inline-VBScript:
@echo off & setlocal
set "VBScript=%Temp%\Search.vbs"
> "%VBScript%" echo Const ForReading = 1
>>"%VBScript%" echo If WScript.Arguments.Count ^> 1 Then
>>"%VBScript%" echo Set objFSO = CreateObject("Scripting.FileSystemObject")
>>"%VBScript%" echo strContent = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False).ReadAll
>>"%VBScript%" echo Set objRegExp = New RegExp
>>"%VBScript%" echo objRegExp.Global = True
>>"%VBScript%" echo objRegExp.IgnoreCase = False
>>"%VBScript%" echo objRegExp.Pattern = "(\b" ^& WScript.Arguments(1) ^& "\b)\s(\b[^\s]*\b)"
>>"%VBScript%" echo Set colMatches = objRegExp.Execute(strContent)
>>"%VBScript%" echo WScript.Echo colMatches.Count ^& " Fundstelle(n)"
>>"%VBScript%" echo For Each objMatch In colMatches
>>"%VBScript%" echo WScript.Echo objMatch.SubMatches(1)
>>"%VBScript%" echo Next
>>"%VBScript%" echo End If
::Das VBScript ausführen, Ausgaben erscheinen auf dem Schirm
cscript /nologo "%VBScript%" "text.txt" "Name"
::Wenn Du die Anzahl der Fundstellen im Batchscript benötigst
for /f %%l in ('cscript /nologo "%VBScript%" "text.txt" "Name" ^| find "Fundstelle"') do set "nMatches=%%l"
echo %nMatches%
del "%VBScript%"
Gruß
Friemler
Weitere Möglichkeit:
Hier muss die verzögerte Variablenerweiterung benutzt werden.
Gruß
Friemler
@echo off & setlocal enabledelayedexpansion
set "VBScript=%Temp%\Search.vbs"
> "%VBScript%" echo Const ForReading = 1
>>"%VBScript%" echo If WScript.Arguments.Count ^> 1 Then
>>"%VBScript%" echo Set objFSO = CreateObject("Scripting.FileSystemObject")
>>"%VBScript%" echo strContent = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False).ReadAll
>>"%VBScript%" echo Set objRegExp = New RegExp
>>"%VBScript%" echo objRegExp.Global = True
>>"%VBScript%" echo objRegExp.IgnoreCase = False
>>"%VBScript%" echo objRegExp.Pattern = "(\b" ^& WScript.Arguments(1) ^& "\b)\s(\b[^\s]*\b)"
>>"%VBScript%" echo Set colMatches = objRegExp.Execute(strContent)
>>"%VBScript%" echo WScript.Echo colMatches.Count
>>"%VBScript%" echo For Each objMatch In colMatches
>>"%VBScript%" echo WScript.Echo objMatch.SubMatches(1)
>>"%VBScript%" echo Next
>>"%VBScript%" echo End If
::VBScript ausführen und aus der Ausgabe die Anzahl Matches (Zeile 1) in Variable und
::die einzelnen Matches (alle anderen Zeilen) in Batch-Pseudoarray einlesen
for /f "tokens=1* delims=:" %%a in ('cscript /nologo "%VBScript%" "text.txt" "Name" ^| findstr /n "^"') do (
if "%%a" equ "1" (
set "nMatches=%%b"
) else (
set "Matches=!Matches!;"%%b""
)
)
del "%VBScript%"
::Alle Matches ausgeben
echo %nMatches% Fundstelle(n)
set /a Cntr=0
for %%m in (%Matches%) do (
set /a Cntr+=1
echo !Cntr!. Fund: %%~m
)
echo.
::Einen bestimmten Match ausgeben, hier den dritten
set "n=3"
echo %n%. Fund:
for /f "tokens=%n% delims=;" %%m in ("%Matches%") do echo %%~m
Hier muss die verzögerte Variablenerweiterung benutzt werden.
Gruß
Friemler
Hallo carp-catcher,
Es wäre nett, wenn Du bei Code-Postings die verwenden würdest, das erleichtert das Lesen und vermeidet, dass Quellcode, so wie oben, plötzlich in einer Textbox erscheint oder Einrückungen verloren gehen. Das kann auch noch nachträglich gemacht werden .
Was hast Du denn hinter
Gruß
Friemler
Es wäre nett, wenn Du bei Code-Postings die verwenden würdest, das erleichtert das Lesen und vermeidet, dass Quellcode, so wie oben, plötzlich in einer Textbox erscheint oder Einrückungen verloren gehen. Das kann auch noch nachträglich gemacht werden .
Was hast Du denn hinter
hallo
in C:\Users\laurenz\Desktop\Liste.txt
stehen? Deine Anforderung war, das nach dem Suchbegriff stehende zu finden.Gruß
Friemler
Zitat von @carp-catcher:
Ich möchte das der text der rechts neben dem gesuchtem Wort steht über echo ganz normal angezeigt wird.
Ich möchte das der text der rechts neben dem gesuchtem Wort steht über echo ganz normal angezeigt wird.
Ich sagte doch schon, dass nach dem Suchbegriff etwas stehen muss. Schreib' mal
<Leerzeichen>Test
o.ä. hinter Name
in die Liste.txt.Machst Du Urlaub auf dem Mond? Ich meine ja nur, wegen der langen Leitung...
Gruß
Friemler