Forum: PC-Programmierung Win Batch if exist und findstr


von Alex (Gast)


Lesenswert?

Hallo,
hab ein Problem die Batch funtioniert nicht so wie gedacht...

Das findstr oder das Auslesen vom %errorlevel% wird nicht wie erwartet 
ausgeführt…

Das 1. findstr & errorlevelvor der if exist Anweisung werden wie 
erwartet ausgeführt/gesetzt.
Das 2. findstr in der if exist Anweisung wird nicht ausgeführt  oder die 
Var errorlevel werde nicht richtig gesetzt.
Das einzige was ich sehe ist dass das errorlevel in der if immer 0 ist. 
Unabhängig davon ob das gesuchte Wort in der Datei enthalten ist oder 
nicht.

Was muss gemacht damit der Code in der if Bedingung seinen zweck 
erfühlt?

Die report.txt Datei befindet sich im gleichen Ordner wie die Batch.

--------------
echo off
set FL=D:/
rem 1. find
findstr /m "FAILED failed" report.txt
echo %errorlevel%

if exist %FL% (
    rem 2. find
    findstr /m "FAILED failed" report.txt
    echo %errorlevel%
    if %errorlevel%==0 (
        COLOR 4F
    ) else (
        COLOR 2F
    )
) else (
    COLOR 7F
    echo.
    echo Pfad nicht gefunden.
    echo.
)
pause

von Thorsten W. (Firma: TWcom Dienstleistungen) (hologram73)


Lesenswert?

set FL=D:/ ??????????

muss das nicht heißen: set FL=D:\

VG

von Alex (Gast)


Lesenswert?

Hi,
ja hast recht, habs übersehen.

Ändert aber nichts am verhalten. :(

von Thorsten W. (Firma: TWcom Dienstleistungen) (hologram73)


Lesenswert?

hi,
habe es gerade mal getestet.

Wenn LW D:\ nicht existent ist, dann wird es grau mit der Meldung "Pfad 
nicht gefunden".

Existiert die report.txt und der String "FAILED" oder "failed" 
existiert, wird es grün und wenn der String nicht enthalten wird wirds 
rot.

oder verstehe ich hier das Problem nicht????

VG

von Alex (Gast)


Lesenswert?

Danke für die Hilfe.

Ja, wird der Pfad nicht gefunden soll die Meldung angezeigt werden.

Aber ist "FAILED" oder "failed" nicht enthalten soll es grün werden.
Das funktioniert auch.
Im Grunde hab ich nur die funktionierende Batch erweitert. Danach 
funktionierte sie nicht mehr...

So funktioniert es
-----------------------------
echo off
findstr /m "FAILED failed" report.txt
echo %errorlevel%
if %errorlevel%==0 (
    COLOR 4F
    ) else (
    COLOR 2F
    )
pause
----------------------------

So funktioniert es nicht. Und ich verstehe nicht wieso.
----------------------------
echo off
set FL_PRO=D:\

if exist %FL_PRO% (
    findstr /m "FAILED failed" report.txt
    echo %errorlevel%
    if %errorlevel%==0 (
        COLOR 4F
    ) else (
        COLOR 2F
    )
) else (
    COLOR 7F
    echo.
    echo Pfad nicht gefunden.
    echo.
)
pause
---------------------

von Sascha R. (srt2018)


Lesenswert?

Der Inhalt in den runden Klammern (somit auch die Ersetzung von 
%errorlevel%) wird ausgewertet bevor er ausgeführt wird.
Mach mal das "Echo Off" weg, dann siehst du das.

Lösung kann ich jetzt am Handy nicht vorschlagen. Ggf. mit findstr ... 
&& color A || color B versuchen.

von Stefan P. (form)


Lesenswert?

Alex schrieb:
> echo %errorlevel%
>     if %errorlevel%==0

Das If wertet hier den Errorlevel von "Echo" aus! (Also nicht mehr den 
von findstr)

von Alex (Gast)


Lesenswert?

Hallo,
hab das Skript auf das Minimum reduziert.
Das findstr setzt das errorlevel in der Klammer nicht unabhängig ob das 
Suchwort in der Datei enthalten ist oder nicht.

----------------------------------
set FL_PRO=D:\
if exist %FL_PRO% (
    findstr /m "failed" report.txt
    if %errorlevel%==0 (
        COLOR 4F
    ) else (
        COLOR 2F
    )
)
Pause
-----------------------------------

Ausgabe des Skriptes
---------------------------------
if exist D:\ (
findstr /m "failed" report.txt
 if 0 == 0 (COLOR 4F )  else (COLOR 2F )
)
report.txt

pause
Drücken Sie eine beliebige Taste . . .
----------------------------------


@Stefan P.
Das Errorlevel müsste dann zumindest richtig angezeigt werden was es 
nicht tut.

Bin grade echt überfragt wieso es nicht funktioniert...

von Sascha Ruppert (Gast)


Lesenswert?

Siehe meine Antwort oben. %errorlevel% wird zu 0 ersetzt bevor findstr 
überhaupt aufgerufen wird.

Setze probehalber echo on und studiere die Ausgabe. Dann wirst du das 
sehen.

von Alex (Gast)


Lesenswert?

Ok, hatte es falsch verstanden gehabt...

Aber wie erzwinge ich die richtige Verarbeitung?

START /wait findstr /m "failed" report.txt

Hilft auch nicht.

von Sascha R. (srt2018)


Lesenswert?

1
findstr ... && color 4F || color 2F

von guest (Gast)


Lesenswert?

eventuell hilft:
1
setlocal enabledelayedexpansion

von S. R. (svenska)


Lesenswert?

Die Existenz eines Ordners prüft man klassisch mit
1
IF EXIST D:\PFAD\NUL GOTO ERROR

Denn die magische Datei "NUL" existiert in jedem vorhandenen Ordner. 
Theoretisch geht das auch mit anderen Gerätenamen, aber die können 
seltsame Effekte verursachen.

von PittyJ (Gast)


Lesenswert?

Macht man heute immer nach Batch-Datei Programmierung?
Gefühlt habe ich das vor 30 Jahren mal gemacht. Ich dachte, Windows 
hätte schon bessere Scriptsprachen mit an Bord.
Ich hätte beinahe gesagt: Geh in die Stadtbücherei, da gibt es:
"Das große Buch zur Batchverarbeitung" von Data Becker.

von S. R. (svenska)


Lesenswert?

PittyJ schrieb:
> Ich dachte, Windows hätte schon bessere Scriptsprachen mit an Bord.

Wie wäre es mit VBScript oder JScript? :-)
Der eigentliche Ersatz ist die PowerShell, aber damit werde ich 
irgendwie nicht so richtig warm. Vermutlich bin ich DOS- und 
Linux-versaut.

von Alex (Gast)


Lesenswert?

Danke für die Hilfe.
Es funktioniert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.