beatzler
Goto Top

Batch IF Befehl zum Abfragen eines einzelnen Wertes mit mehreren Werten in einer Variable...

Hey,

könnte mir vielleicht bitte jemand bei folgendem Problem einen Tipp oder eine Hilfestellung geben ???

Wäre super! Vielen Dank im voraus!


In einer Batch wird ein Übergabeparameter %1 geprüft:

IF %1 == "STICHWORT!" ( SET AUSWAHL=1 ) else ( SET AUSWAHL=0 )

Soweit so gut.

Problem ist jetzt nur das in %1 aber immer mehrere Wörter / eine längere Zeile übergeben wird...

z.B.
%1="STICHWORT! Hier ist der restliche Text"

oder einfach nur

%1="Hier ist nochmals ein anderer restlicher Text"


Meine Abfrage oben greift aber nur wenn %1 wirklich nur "STICHWORT!" enthält ... face-sad

Wie kann ich %1 trotzdem abfragen und richtig zurordnen obwohl mehrere Wörter enthalten sind ?


Vielen Dank für einen Tipp!

MFG Beatzler

Content-Key: 162407

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

Printed on: April 26, 2024 at 14:04 o'clock

Member: bastla
bastla Mar 10, 2011 at 13:29:36 (UTC)
Goto Top
Hallo Beatzler!

Versuch es etwa so:
echo %1|findstr "STICHWORT!">nul && SET "AUSWAHL=1" || SET "AUSWAHL=0"
Grüße
bastla
Member: Beatzler
Beatzler Mar 10, 2011 at 15:12:42 (UTC)
Goto Top
Hey bastla,

vielen Dank für deine schnelle Antwort mal wieder face-smile

Leider klappt es nicht so ganz ...

Dein Code oben ist nur Stichpunktartig oder?

Habe es jetzt nochmal so versucht:

echo %1 > C:\Test\test.txt
set "WORT=C:\Test\test.txt
findstr /c:"STICHWORT!" "C:\Test\test.txt">nul && for /f "usebackq delims=" %%i in ("%WORT%") do SET AUSWAHL=1

klappt aber auch nicht so richtig .....

Es muss doch auch direkt gehen %1abzufragen ohne erst in eine txt zu exportieren oder ?

MFG Beatzler
Member: bastla
bastla Mar 10, 2011 at 15:42:45 (UTC)
Goto Top
Hallo Beatazler!
Dein Code oben ist nur Stichpunktartig oder?
Keineswegs - als etwas "verzierter" Batch "CheckParam.cmd"
@echo off & setlocal
echo %1
echo %1|findstr "STICHWORT!">nul && SET "AUSWAHL=1" || SET "AUSWAHL=0"  
echo %AUSWAHL%
liefert er folgende Ergebnisse
D:\>CheckParam.cmd "STICHWORT! Hier ist der restliche Text"
"STICHWORT! Hier ist der restliche Text"
1

D:\>CheckParam.cmd "Hier ist nochmals ein anderer restlicher Text"
"Hier ist nochmals ein anderer restlicher Text"
0
Um ev noch Unterschiede aufgrund der Groß-/Kleinschreibung auszuschließen, könntest Du "findstr /i" verwenden ...

Grüße
bastla
Member: Beatzler
Beatzler Mar 10, 2011 at 18:08:56 (UTC)
Goto Top
Hey bastla.

Ich werde das nochmals in Ruhe testen. Dachte das Wäre nur nen Schnipsel oder so.

Vielen dank erstmal wieder an dich, super face-smile

MfG beatzler
Member: Beatzler
Beatzler Mar 13, 2011 at 18:54:09 (UTC)
Goto Top
Hey,

das klappt soweit super face-smile

Nur leider hab ich aktuell schon knapp 200 findstr abfragen ....

Die Batch braucht schon ne gewisse Zeit jetzt bis sie durchgelaufen ist ...

Gibs ggf. zu findstr noch ne schnellere Alternative ???

Danke für Tipps!

MFG Beatzler
Member: Beatzler
Beatzler Mar 14, 2011 at 21:14:03 (UTC)
Goto Top
Hey,

alsoo ich komm da irgendwie auf überhaupt keinen grünen Zweig face-sad Batch scheint dafür zu langsam zu sein ....

Habe nun versucht das ganze mit vbs anzufangen nur da hab ich noch weniger Ahnung von :/

z.B. mit einer weiteren Hilfe habe ich es aktuell soweit hinbekommen das folgende VBS grundlegen läuft ...

If Wscript.Arguments(0) = "test" Then wscript.echo "Ausgabetext"

Wird das so aufgerufen: skript.vbs test gibt er mir in einer extra box Ausgabetext aus

Soweit so gut

Problem 1 ist jetzt das mein beispielwert, hier test, ja leider real an einer belibigen stelle in einer längern Variablen stehen würde

Problem 2: Ich würde das vbs file dann ja aus der Batch starten ... wie bekomme ich den "gefilterten" Wert zurück in die Batch zum weiterverarbeiten und das die batch solange wartet ?!

Fragen über fragen ....

Danke für tipps nochmals !
Member: bastla
bastla Mar 14, 2011 at 21:24:36 (UTC)
Goto Top
Hallo Beatzler!

Das VBScript müsste eher so aussehen (ungetestet):
If InStr(WScript.Arguments(0),WScript.Arguments(1))>0 Then WScript.Echo "Ausgabetext" Else WScript.Echo "Alternativtext"
bzw, wenn die Rückgabe von 0 oder 1 genügt, auch so:
WScript.Echo Abs(InStr(WScript.Arguments(0),WScript.Arguments(1))>0)
und der Aufruf könnte so erfolgen:
set "AUSWAHL="  
for /f %%i in ('cscript //nologo script.vbs "%~1" "STICHWORT!"') do set "AUSWAHL=%%i"  
if defined AUSWAHL echo %AUSWAHL% else echo Kein Rueckgabewert!
Grüße
bastla
Member: Beatzler
Beatzler Mar 14, 2011 at 21:46:37 (UTC)
Goto Top
Hey Bastla,

danke für deinen erneuten Tipp vielmals!

Also den eigentlichen Aufruf habe ich denke ich soweit verstanden, konnte ich aber noch nicht testen weil das skript fehlt ...

Wo gebe ich denn bei deiner ersten vb skript variante den Suchwert ein ?

MFG Beatzler
Member: bastla
bastla Mar 15, 2011 at 06:43:44 (UTC)
Goto Top
Hallo Beatzler!

Du übergibst dem Script den zu durchsuchenden Text (also den Batch-Parameter %1) und das Suchwort (im Beispiel "STICHWORT!") wie in der Zeile 2 des Batchbeispieles gezeigt - die beiden Scriptvarianten unterscheiden sich eigentlich nur dadurch, dass im ersten Fall die Rückgabewert als Text festgelegt werden (was allerdings auch im Batch per "if" erfolgen könnte) und im zweiten Ansatz immer 1 oder 0 als Ergebnis geliefert wird ...

Grüße
bastla
Member: Beatzler
Beatzler Mar 15, 2011 at 12:51:07 (UTC)
Goto Top
Hey Bastla,

jetzt hab ich es verstanden und konnte es nachvollziehen.

Habe das ganze grad mal mit ein paar mehr werten getestet

dann müsste die Batch ja so aussehen:

"sinngemäß"

@echo OFF
set "AUSWAHL="
for /f %%i in ('cscript nologo script.vbs "%~1" "STICHWORT!1"') do set "AUSWAHL=%%i"
for /f %%i in ('cscript
nologo script.vbs "%~1" "STICHWORT!2"') do set "AUSWAHL=%%i"
for /f %%i in ('cscript nologo script.vbs "%~1" "STICHWORT!3"') do set "AUSWAHL=%%i"
for /f %%i in ('cscript
nologo script.vbs "%~1" "STICHWORT!4"') do set "AUSWAHL=%%i"
for /f %%i in ('cscript //nologo script.vbs "%~1" "STICHWORT!5"') do set "AUSWAHL=%%i"

Das ganze funktioniert soweit jetzt auch soweit nur leider noch langsamer als dein ursprünglicher Batch Abfrage aufruf von oben face-sad Mhhh
Member: bastla
bastla Mar 15, 2011 at 13:55:25 (UTC)
Goto Top
Hallo Beatzler!

Vielleicht erklärst Du einmal, was das eigentliche Ziel der ganzen Aktion ist - was passiert aufgrund des Inhaltes von %AUSWAHL% dann weiter? Soll das übrigens eine "Oder"-Verknüpfung für alle Stichworte ergeben, oder muss tatsächlich jedes einzeln ausgewertet werden?

Grüße
bastla
Member: Beatzler
Beatzler Mar 15, 2011 at 14:19:11 (UTC)
Goto Top
Hey,

also das ganze ist für ne kleine private sprachansage .... Anfangs sollte das ganze nur auf einen Fehlerzustand hinweisen z.B. unterscheiden zwischen einem " normalen" Fehler und dann Ansage normal aufrufen oder einem kritischem Fehler und dann den kritischen Fehler zur Playlist hinzufügen und abspielen ...

Das klappt ja dank deiner Hilfe auch schon super face-smile

In den Übergabeparametern befindet sich die Fehlermeldung und eine Fehlernummer ... diese soll ausgewertet werden. Dann wird mittels Batch eine Playlist erzeugt und diese mit dem WM Player einfach abgespielt und danach direkt gelöscht ...

So nun möchte ich aber auch ganz gerne noch die Fehlernummer auswerten und das sind aktuell ca. schon 200 verschiedene... Und wenn halt Fehler Nr 124 in der Übergabevariable enthalten ist dann soll zur Playlist erst die Ansage normaler Fehler und danach dann noch ein kurzes Stichwort zum Fehler 124 ausgegeben werden ....

Die Fehlerart wird sehr schnell ausgewertet und dann sofort wiedergegeben aber wenn das skript dann erst 20 oder 30 sek. Braucht um diesen Hinweistext auch auszuwerten passt das ganze ja nicht mehr gut zusammen ....

Ist Batch oder VB dafür wirklich so ungeeignet da zu langsam ?

Danke dir nochmals !

MFG Beatzler
Member: bastla
bastla Mar 15, 2011 at 16:08:11 (UTC)
Goto Top
Hallo Beatzler!

Wenn Du schon eine Liste der Fehler hast, kannst Du die doch in einer Textdatei hinterlegen - zB in der Form
Fehlernummer@Fehlerbeschreibung
und musst nur noch anhand der Nummer (im Beispiel als %1 übergeben) suchen - etwa:
@echo off & setlocal
set "Nr=%~1"  
set "Liste=D:\Fehlerliste.txt"  
set "Fehler="  
for /f "tokens=1* delims=@" %%i in ('findstr /b "%Nr%@" "%Liste%"') do set "Fehler=%%j"  
if defined Fehler (
    echo Fehler Nr %Nr%: %Fehler%
) else (
    echo Fehler Nr %Nr% nicht gefunden!
)
Grüße
bastla
Member: Beatzler
Beatzler Mar 15, 2011 at 16:58:31 (UTC)
Goto Top
Hey bastla,

das ist einfach super! Genausowas meinte ich, du hast mich verstanden face-wink AUf diesen Lösungsweg mit dem externen suchen lassen in einer txt bin ich nicht gekommen ... vielen Dank!

Dein Skript läuft soweit genau so wie es soll wenn die erste Übergabevariable z.B. genau 100 ist klappt es bestens!

Aber Problem ist jetzt ja leider das die 100 irgendwo in der Übergabevariable steht ... Also z.B:

%1 = "*STICHWORT!*Fehlerart*Fehlernummer 124 Details*"

Wie würde man sowas am besten lösen ? Habe schon div. findstr parameter versucht, leider ohne Erfolg.

Untersuche ich die Fehlervariable mit der obigen if variante funktioniert´s genauso wie es soll auch auf einen Fehlercode:



UND

Kann man dir mal irgendwie was gutes tun ? Hast mir hier ja wirklich schon sooo viel geholfen !?!
Member: bastla
bastla Mar 15, 2011 at 17:44:11 (UTC)
Goto Top
Hallo Beatzler!

Entspricht Dein Beispiel dem grundsätzlichen Aufbau des übergebenen Parameters (inkl der Sterne als Trennzeichen)? Wenn ja und daher die Fehlernummer immer an der selben Position (also zB wie oben als 2. Wort - gezählt anhand der Leerzeichen) steht, könntest Du sie so isolieren:
set "Nr="  
for /f "tokens=2" %%i in ("%~1") do set "Nr=%%i"  
if defined Nr echo Fehler Nr %Nr%
Grüße
bastla

P.S.:
Kann man dir mal irgendwie was gutes tun ?
Danke für das Angebot face-smile - aber vielleicht kannst Du ja selbst einmal jemandem (womit auch immer) helfen ...
Member: Beatzler
Beatzler Mar 16, 2011 at 16:20:01 (UTC)
Goto Top
HEy Bastla,


viiiilen Dank für deine super Unterstützung !!! Dank deiner Hilfe habe ich es nun endlich hinbekommen und es läuft so wie es soll face-smile einfach super !!!

Danke nochmals

MFG Beatzler