apop85
Goto Top

Set name gleich findstr-Ausgabe. Wie Kriege ich das am besten hin... set oder for?

Hallo

Also habe mich durch das FOR tutorial gelesen aber habe einige Abschnitte wohl nicht ganz verstanden.
Ich möchte dass das Ergebnis von findstr als Variable gespeichert wird und wenn die Variable nicht mit dem eingegebenen übereinstimmt nach :a weiterleiten sonst nach :b

Erst mal SOrry für das zuspamen des Batch/Shell-Bereichs aber es hat mich grad gepackt und da ich an einem für mich schon etwas grösseren Projekt intensiv arbeite kommen Mehrere Fragen nacheinander auf.

Also ich versuche, dass das Ergebnis des findstr Befehls als Variable, nennen wir sie %V1%, gespeichert wird. Dies kann zum Beispiel sein: NAME = 12.34 Euro. %V1% soll dann mit dem bei der Abfrage eingegebenen Daten verglichen werden und wenn diese nicht übereinstimmen soll darauf aufmerksam gemacht werden.

Mittels cmd-Fenster habe ich folgendes Probiert:
set zeile=(findstr %name% "database.txt")  
%zeile%
Kohlenstoff = 12.05 g/mol

Wenn ich dies jedoch mittels Batch ausführe erhalte ich als "echo %V1%" folgende Ausgabe:
findstr NAME  C:\Dokumente und Einstellungen\admin\Desktop\BATCH\database.txt

Ich versteh nun nicht ganz warum es im CMD-Fenster mit einzeleingabe funktioniert jedoch nicht mittels Batch

Wie schon geschrieben habe ich mir mal das FOR-Tutorial angesehen und hab mal was gebastelt.
for /f %%zeile in (findstr %name% %cd%\database.txt) do goto :1

Jedoch könnte ich da auch gleich exit eingeben ;)
Dies habe ich aus dem Tutorial abgeleitet in welchem dies so aufgeführt ist:
for /f %%c in ('echo %Number%^|findstr "[^0-9]"') do goto :InputNumber   

Dies ist das Versuchsscript in welchem ich die Funktion prüfe:
@echo off
:START
set name=Kohlenstoff & set "mcg=12" & set "mcgnk=05"  
echo %name% %mcg%.%mcgnk%

set zeile=(findstr %name% %cd%\database.txt)
echo zeile = %zeile%
pause >NUL

if findstr %name% %cd%\database.txt == %name% %mcg%.%mcgnk% g/mol echo Geschafft & goto START
echo NOPE
pause >NUL
goto START

Danke schonmals für eure Hilfe

Content-Key: 204658

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

Printed on: April 19, 2024 at 17:04 o'clock

Member: Endoro
Endoro Apr 09, 2013 at 05:47:49 (UTC)
Goto Top
Hallo Apop85,

geht (wie meistens in Batch) mit einer Forschleife:

for /f "tokens=1-3 delims=. " %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k"  
if "%name%"=="%DBname%" (echo %name% found) else echo %name% not found  

.. wenn "database.txt" so aufgebaut ist:
name mcg.mcgnk

Welches Tutorial meinst du?


Gruss!
Member: Apop85
Apop85 Apr 09, 2013 updated at 10:21:13 (UTC)
Goto Top
Habe if /? angeschaut und
IF Befehl, wie funktioniert er?

Also ich versuche mal nachzuvollziehen was dieses FOR Script genau durchführt. Ich könnte jetzt auch Kopieren und Enfügen nur versteh ich beim Nächsten mal dann immer noch nicht wies geht ;) daher versuche ich dcas mal für mich auszudeutschen

for /f "tokens=1-3 delims=. " %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set   
WENN (Eingabe Zeichenkette) "Lese Variablen 1-3 (%%i %%j %%k)
Trennzeichen=- "
%%Variabel1 findet man IN
('findstr "%name%" "%cd%\database.txt') MACHE set "DBname=%%Variabel1

Den Nächsten Teil verstehe ich nicht ganz warum du dies so geschrieben hast
set "DBmcg=%%j"& set "DBmcgnk=%%k"  

Wenn du versuchst hier die Zahlen der Datenbank auszulesen musst du mir das nochmals etwas erläutern. In der Datenbank sind die Einträge wie Folgt:

"STOFFNAME - %mcg%.%mcgnk% mcg/l"
z.B. "Kohlenstoff - 12.05 mcg/l"

Die IF Überprüfung ist mir dann wieder klar.

Hab aber noch allgemeine Fragen.

Du benutzt bei dir %%i das habe ich einigen Scripts schon so gesehen. Hat das eine bestimmte bedeutung dass als Variabel "i" gewählt wird oder hat sich das einfach so etabliert?

Habe ich das richtig verstanden das for / f bedeutet dass ich keinen Ort angebe sondern einen Befehl?

Wozu dient das Trennzeichen (delims)?

Danke für die Hilfe
Member: Endoro
Endoro Apr 09, 2013 updated at 11:43:54 (UTC)
Goto Top
Hallo Apop85,

damit meine Schleife richtig funktioniert, muss noch "-" bei den Tokentrennern eingefügt werden:
for /f "tokens=1-3 delims=.- " %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k"  
if "%name%"=="%DBname%" (echo %name% found) else echo %name% not found  

Wenn du mehr über Forschleifen wissen willst, brauchst du unbedingt dieses Tutorial. Da ist alles prima erklärt face-wink


Gruss!
Member: Apop85
Apop85 Apr 10, 2013 updated at 16:08:36 (UTC)
Goto Top
Danke viel mals für deine mühe

Musste den Code noch etwas abändern damit er die Ausgabe gemacht hat die ich wollte face-smile
<EDIT> Dein Code Stimmt hab ihn bloss falsch interpretiert ;) </EDIT>
Habe die delims weg genommen weil ich die ganze Zeile der Ausgabe brauche aber vielen Dank für deinen Ansatz. Am Tutorial bin ich noch dran.

for /f "tokens=1-3 delims=" %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k"  
if "%name%"=="%DBname%" (echo %name% found) else echo %name% not found  


So macht es was ich gern möchte. Ich werd das Problem noch nicht als gelöst kennzeichnen weil ich die volle Funktion noch nicht in mein Script integriert habe.

Meine ganze Abfrage lautet.

Wenn %name% in der Datenbank vorhanden ist, lese Zeile aus und benutze die in der Zeile angegebenen Zahlen als Variablen. Sollte in der Datenbank kein Eintrag vorhanden sein frage den Benutzer ob dieser gerne auf Wikipedia nach der Information suchen will. Wurden die Informationen eingegeben erstelle eine neue Zeile in der Datenbank mit den eingegeben Variablen.

Das hinzufügen in die Datenbank sollte kein Problem darstellen sowie auch das Auslesen der Zahlen aus der Zeile face-smile muss aber noch den if-Befehl noch etwas studieren damit ich das so umsetzen kann...

Noch cooler wäre wenn zwei identische Zeilen in der Datenbank existieren müssen damit der Wert automatisch übernommen wird, somit müsste man zwei mal das Selbe eingeben um die Eingaben sozusagen zu verifizieren.

Gruss Apop
Member: Endoro
Endoro Apr 10, 2013 updated at 16:06:32 (UTC)
Goto Top
Hallo Apop,

wenn du die Tokentrenner aus der Schleife wirfst, kannst du auch die "tokens=1-3" rausschmeissen: du wirst ohne Trenner keine erhalten face-smile


Zitat von @Apop85:
Noch cooler wäre wenn zwei identische Zeilen in der Datenbank existieren müssen damit der Wert automatisch

Das verstehe ich nicht. ME sind doppelte Datensätze in einer Datenbank eher Mist.

Gruss!
Member: Apop85
Apop85 Apr 10, 2013, updated at Apr 11, 2013 at 01:36:16 (UTC)
Goto Top
Hallo
Endoro

wenn du die Tokentrenner aus der Schleife wirfst, kannst du auch die "tokens=1-3" rausschmeissen: du wirst ohne Trenner keine erhalten
musste ich auch rausfinden ^^


Das verstehe ich nicht. ME sind doppelte Datensätze in einer Datenbank eher Mist.

Nunja es geht hier um die Umrechnung von Medizinischen Daten daher ist es eine vorsichtsmassnahme, dass die Eingabe des Stoffs doppelt vorhanden sein muss bevor er als "Verifiziert" gillt.

Bin jetzt soweit, dass ich überprüfen möchte ob die Eingabe nicht überschritten wurde.
die Trennung funktioniert bis anhin gut.

Ich habe es so geschrieben, dass er überprüft ob in der Nachkommastelle eine oder mehrere 0 vorhanden sind. Das Problem jedoch ist, dass wenn ich nur zwei Stellen angebe also z.b. 1.25 dann schmiert das Programm ab... das ist natürlich eher suboptimal und ich finde grad keine Lösung dazu...
for /f "delims=. tokens=1-2" %%a in ("%mcg%") do (  
				Set "mcg=%%a"  
				Set "mcgnk=%%b"  
)

if %mcgnk% GEQ 999 goto REWA2
if %mcgnk:~0,3% == 000 if %mcgnk% GEQ 1 goto REWA2
if %mcgnk:~0,2% == 00 if %mcgnk:~2,3% GEQ 9 goto REWA2 -- hier schmiert er ab bei 1.25
if %mcgnk:~0,1% == 0 if %mcgnk:~1,4% GEQ 99 echo REWA2 -- ich nehm an spätestens hier bei 1.2
goto EINGPRUE2

Danke für deine bisherige Hilfe
<edit>
hab da schon mal einen ansatz gefunden wie ich den Absturz umgehen kann ausser bei einer Variabel
Dieses mal möchte ich noch einfügen, dass man auch einfach .123 eingaben kann anstatt 0.123

if "%mcg%" == "" set /a mcg=0              <<-- hier schmiert er dieses mal ab. Könnte aber auch die For schleife sein...  
if "%mcgnk:~2,3%" == "" if "%mcgnk:~1,4%" == "" set /a mcgnk=%mcgnk%*100 & goto EINGPRUE2  
if "%mcgnk:~2,3%" == "" set /a mcgnk=%mcgnk%*10 & goto EINGPRUE2  
</edit>
<edit2>
Hab gemerkt, dass wenn vor dem Punkt nichts steht er die Nachkommastelle als erste Variable definiert...
nun versuche ich dies zu drehen.

if "%mcgnk%" == "" set mcgnk=%mcg% & set mcg=0  

Nur Funktioniert dies leider nicht face-sad
Wenn ich .6 eingebe stellt er mcg zwar auf "0" jedoch mcgnk stellt er auf "6 " Dann schmeisst ihn die 3. Zeile vom ersten Edit zum Resultat... nur da wird dann "0.10 " angezeigt anstatt "0.100"
</edit2>
Apop85


P.S.
gibts für folgende Variabeleigenschaft irgendwo ein Tutorial?
%variable:~0,1%
Was heisst genau was und kann ich z.B. auch von Hinten beginnen? Also dass er z.B. von 1.13456 nur die letzten 3 Zahlen ausliest (456)?
Ich kann aber keine bestimmte länge der variable voraussetzen kann also auch mal 4.123 sein und daraus soll er 123 auslesen.
Member: Apop85
Apop85 Apr 11, 2013 at 20:33:53 (UTC)
Goto Top
Gelöst face-smile
Eigentlich ganz Simpel...

if "%mcgnk%" == "" set /a mcgnk=%mcg%*1 & set mcg=0  

einfach mcgnk als Rechnung x 1 nehmen und es kommt wie ichs möchte face-smile

also gesammte abfrage für die Zahl lautet;
for /f "delims=. tokens=1-2" %%a in ("%mcg%") do (  
				Set "mcg=%%a"  
				Set "mcgnk=%%b"  
)

if "%mcgnk%" == "" set /a mcgnk=%mcg%*1 & set mcg=0  
echo "%mcg%" "%mcgnk%"  
pause
if %mcgnk% GEQ 999 goto REWA2

echo "%mcg%" "%mcgnk%"  
if "%mcgnk:~2,3%" == "" if "%mcgnk:~1,4%" == "" set /a mcgnk=%mcgnk%*100 & goto EINGPRUE2  
if "%mcgnk:~2,3%" == "" set /a mcgnk=%mcgnk%*10 & goto EINGPRUE2  
if %mcgnk:~0,3% == 000 if %mcgnk% GEQ 1 goto REWA2
if %mcgnk:~0,2% == 00 if %mcgnk:~2,3% GEQ 9 goto REWA2 
if %mcgnk:~0,1% == 0 if %mcgnk:~1,4% GEQ 99 echo REWA2

Ich werd das Thema mal schliessen. Wenn jemand noch einen Link eines Tutorials hätte für folgenden Abschnitt wär ich ganz froh.
%variable:~0,1%



Grüsse und Danke wieder mal für die Hilfe