Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: Apop85

Apop85 (Level 1) - Jetzt verbinden

09.04.2013, aktualisiert 00:55 Uhr, 1558 Aufrufe, 7 Kommentare

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:
01.
set zeile=(findstr %name% "database.txt") 
02.
%zeile% 
03.
Kohlenstoff = 12.05 g/mol
Wenn ich dies jedoch mittels Batch ausführe erhalte ich als "echo %V1%" folgende Ausgabe:
01.
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.
01.
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:
01.
for /f %%c in ('echo %Number%^|findstr "[^0-9]"') do goto :InputNumber 
Dies ist das Versuchsscript in welchem ich die Funktion prüfe:
01.
@echo off 
02.
:START 
03.
set name=Kohlenstoff & set "mcg=12" & set "mcgnk=05" 
04.
echo %name% %mcg%.%mcgnk% 
05.
 
06.
set zeile=(findstr %name% %cd%\database.txt) 
07.
echo zeile = %zeile% 
08.
pause >NUL 
09.
 
10.
if findstr %name% %cd%\database.txt == %name% %mcg%.%mcgnk% g/mol echo Geschafft & goto START 
11.
echo NOPE 
12.
pause >NUL 
13.
goto START
Danke schonmals für eure Hilfe

Mitglied: Endoro
09.04.2013 um 07:47 Uhr
Hallo Apop85,

geht (wie meistens in Batch) mit einer Forschleife:

01.
for /f "tokens=1-3 delims=. " %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k" 
02.
if "%name%"=="%DBname%" (echo %name% found) else echo %name% not found
.. wenn "database.txt" so aufgebaut ist:
01.
name mcg.mcgnk
Welches Tutorial meinst du?


Gruss!
Bitte warten ..
Mitglied: Apop85
09.04.2013, aktualisiert um 12:21 Uhr
Habe if /? angeschaut und
http://www.administrator.de/forum/if-befehl-wie-funktioniert-er-46913.h ...

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

01.
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
</code>
Den Nächsten Teil verstehe ich nicht ganz warum du dies so geschrieben hast
01.
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
Bitte warten ..
Mitglied: Endoro
09.04.2013, aktualisiert um 13:43 Uhr
Hallo Apop85,

damit meine Schleife richtig funktioniert, muss noch "-" bei den Tokentrennern eingefügt werden:
01.
for /f "tokens=1-3 delims=.- " %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k" 
02.
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


Gruss!
Bitte warten ..
Mitglied: Apop85
10.04.2013, aktualisiert um 18:08 Uhr
Danke viel mals für deine mühe

Musste den Code noch etwas abändern damit er die Ausgabe gemacht hat die ich wollte
<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.

01.
for /f "tokens=1-3 delims=" %%i in ('findstr "%name%" "%cd%\database.txt"') do set "DBname=%%i"& set "DBmcg=%%j"& set "DBmcgnk=%%k" 
02.
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 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
Bitte warten ..
Mitglied: Endoro
10.04.2013, aktualisiert um 18:06 Uhr
Hallo Apop,

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


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!
Bitte warten ..
Mitglied: Apop85
11.04.2013, aktualisiert um 03:36 Uhr
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...
01.
for /f "delims=. tokens=1-2" %%a in ("%mcg%") do ( 
02.
				Set "mcg=%%a" 
03.
				Set "mcgnk=%%b" 
04.
05.
 
06.
if %mcgnk% GEQ 999 goto REWA2 
07.
if %mcgnk:~0,3% == 000 if %mcgnk% GEQ 1 goto REWA2 
08.
if %mcgnk:~0,2% == 00 if %mcgnk:~2,3% GEQ 9 goto REWA2 -- hier schmiert er ab bei 1.25 
09.
if %mcgnk:~0,1% == 0 if %mcgnk:~1,4% GEQ 99 echo REWA2 -- ich nehm an spätestens hier bei 1.2 
10.
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

01.
if "%mcg%" == "" set /a mcg=0              <<-- hier schmiert er dieses mal ab. Könnte aber auch die For schleife sein... 
02.
if "%mcgnk:~2,3%" == "" if "%mcgnk:~1,4%" == "" set /a mcgnk=%mcgnk%*100 & goto EINGPRUE2 
03.
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.

01.
if "%mcgnk%" == "" set mcgnk=%mcg% & set mcg=0
Nur Funktioniert dies leider nicht
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?
01.
%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.
Bitte warten ..
Mitglied: Apop85
11.04.2013 um 22:33 Uhr
Gelöst
Eigentlich ganz Simpel...

01.
if "%mcgnk%" == "" set /a mcgnk=%mcg%*1 & set mcg=0
einfach mcgnk als Rechnung x 1 nehmen und es kommt wie ichs möchte

also gesammte abfrage für die Zahl lautet;
01.
for /f "delims=. tokens=1-2" %%a in ("%mcg%") do ( 
02.
				Set "mcg=%%a" 
03.
				Set "mcgnk=%%b" 
04.
05.
 
06.
if "%mcgnk%" == "" set /a mcgnk=%mcg%*1 & set mcg=0 
07.
echo "%mcg%" "%mcgnk%" 
08.
pause 
09.
if %mcgnk% GEQ 999 goto REWA2 
10.
 
11.
echo "%mcg%" "%mcgnk%" 
12.
if "%mcgnk:~2,3%" == "" if "%mcgnk:~1,4%" == "" set /a mcgnk=%mcgnk%*100 & goto EINGPRUE2 
13.
if "%mcgnk:~2,3%" == "" set /a mcgnk=%mcgnk%*10 & goto EINGPRUE2 
14.
if %mcgnk:~0,3% == 000 if %mcgnk% GEQ 1 goto REWA2 
15.
if %mcgnk:~0,2% == 00 if %mcgnk:~2,3% GEQ 9 goto REWA2  
16.
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.
01.
%variable:~0,1%



Grüsse und Danke wieder mal für die Hilfe
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Server
gelöst Wo ist der Speicherplatz hin? Festplatte voll, aber womit? Windows Server 2012R2 (9)

Frage von Andinistrator1 zum Thema Windows Server ...

Windows Server
Windows Remote App - Ausgabe in lokales Office (1)

Frage von fluluk zum Thema Windows Server ...

Python
Python - ausgabe formatieren

Frage von BadFsaadKl zum Thema Python ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...