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

Findstr in for schleife gibt kein errorlevel zurück

Frage Entwicklung Batch & Shell

Mitglied: didie08

didie08 (Level 1) - Jetzt verbinden

02.02.2010 um 11:15 Uhr, 9722 Aufrufe, 17 Kommentare

Hallo,

Ich möchte innerhalb einer for schleife den findstr Befehl nutzen. Ich habe hier das Problem das findstr immer %errorlevel%= 0 ausgibt, egal ob der gesuchte string in text2.txt vorkommt oder nicht.

01.
@echo on & enabledelayedexpansion 
02.
 
03.
for /f "tokens=1,2,3,4 delims= " %%i in ('findstr "name" text1.txt') do ( 
04.
	findstr "%%j" text2.txt 
05.
	if %errorlevel% EQU 0 echo  %%i %%j %%k %%l>>text2.txt 
06.
)
Kann mir jemand weiterhefen ?
Mitglied: Biber
02.02.2010 um 11:36 Uhr
Moin didie08,

ersetze das "if %errorlevel% EQU 0 echo " innerhalb der FOR-Anweisung durch ein "if NOT ERRORLEVEL 1 echo "

Erläuterung:
wenn du innerhalb einer Befehlszeile (und auch eine mehrzeilig formatierte FOR-Anweisung ist eine Befehlszeile) eine %variable% ansprichst,
so wie du in deinem Beispiel %errorlevel%, dann wird si einmal aufgelöst (quasi zu Beginn der Ausführung) und nicht dynamisch.

Grüße
Biber
Bitte warten ..
Mitglied: edepfau
02.02.2010 um 12:05 Uhr
(nur falls das jemand mal per google findet) - die Lösung ist richtig, aber die Erklärung trifft's nicht.

Wenn Du %errorlevel% benutzt, dann wird damit eine Umgebungsvariable namens errorlevel gemeint. Die gibt es in der Regel aber nicht!
Was Du wirklich meinst, ist der Rückgabewert ERRORLEVEL. Der wird wie in der Lösung per "IF ERRORLEVEL wert" abgefragt.
Noch fataler wird es, wenn man vorsichtshalber vor dem überwachten Befehl den ERRORLEVEL zurücksetzen will:
(FALSCH)
set /a %errorlevel%=0
Befehl
if %errorlevel% EQU 0 ....wird immer ausgeführt!

(RICHTIG)
verify >nul
if not errorlevel 1 ...


Noch eine Falle:
Bei IF ERRORLEVEL wird auf "grösser gleich wert" geprüft, nicht auf Gleichheit. Daher die Negation: "NOT >=" bedeutet "<". Der Grund ist, dass ein Rückgabewert von 0 OK bedeutet, alles andere FEHLER. Welcher Fehler kann dann aus dem Wert bestimmt werden (interessiert hier aber nicht).

HTH
Ede
Bitte warten ..
Mitglied: Biber
02.02.2010 um 12:31 Uhr
Moin edepfau,

nur falls jemand das über eine Suchmaschine findet:

Diesen Satz.
...wird damit eine Umgebungsvariable namens errorlevel gemeint. Die gibt es in der Regel aber nicht!
möcte ich ungern so stehen lassen.

Wenn du einfach z.B. die Hilfe zu SET (oder anderen) aufrufst und nach "errorlevel" suchst, liest Du [in Zeile 03], was ich meine:
01.
>set /?|find /i "errorlev" 
02.
Der SET-Befehl legt den ERRORLEVEL mit 1 fest, wenn der Variablenname nicht 
03.
%ERRORLEVEL% - expandiert zum aktuellen ERRORLEVEL-Wert.
%errorlevel% als dynamische Variable gibt es IMMER und (deswegen ja dynamisch) IMMER nach jeder abgesetzten Befehlszeile aktualisiert/expandiert.
So wie auch %date%, %time%, %random%. Diese Variablen werden allesamt nicht bei SET angezeigt, aber "es gibt sie schon".

Besonderheit bei der Prüfung des ERRORLEVELs ist aber unter anderem, dass es neben der üblichen Syntax "IF %errorlevel% == n" auch noch die Syntax "IF ERRORLEVEL n" gibt... ohne Prozentzeichen drumherum und ohne Gleichheitszeichen. Und dieses "IF ERRORLEVEL n" wird eben nicht wie ein "IF %errorlevel% ==.." bei Beginn der Ausführung aufgelöst.

Grüße
Biber
Bitte warten ..
Mitglied: edepfau
02.02.2010 um 12:53 Uhr
Das stimmt so nicht, und weil diese Meinung so weit verbreitet ist, habe ich auf den Unterschied hingewiesen.

Die errorlevel Variable ist eben keine Umgebungsvariable, d.h. wird nicht im Environment definiert, abgefragt oder gelöscht. MS hat die Syntax der der Umgebungsvariablen angepasst, um dem User nicht noch eine Schreibweise zuzumuten (z.B. $errorlevel$). Und weil das keine Umgebungsvariable ist, braucht man auch keine delayed expansion (den Befehl kann man oben gleich löschen).
Wenn man den Unterschied kennt, dann wird man auch nicht versucht sein,
set /a ERRORLEVEL 3
zu tippen. Das klappt zwar, aber dann hat man eine Umgebungsvariable gleichen Namens erzeugt, die völlig statisch ist. D.h. man kann den Rückgabewert von Befehlen nicht mehr (mit %errorlevel%) abfragen.

Hier ist ein Artikel, der das beschreibt (aus MSDN): The Old New Thing - ERRORLEVEL is not %ERRORLEVEL%
in http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx

Gruß,
Ede
Bitte warten ..
Mitglied: Biber
02.02.2010 um 13:14 Uhr
Moin edepfau,

ich denke, da hast du etwas missverstanden.
Aber ist mir auch nicht so wichtig und ich denke, die MitleserInnen können sich in dem angeführten Blog-Artikel und in der Hilfe am CMD-Prompt ja selbst ein Bild.
machen.

Dieses absurde Beispiel mit dem "SET ERRORLEVEL=whatever"... ja hey! Das ist Dönekens.

Du kannst beispielsweise auch die dynamische %random%-Variable auf 42 setzen.
Und den Wert 42 behält sie auch..
01.
>set random=42 
02.
 
03.
>echo %random% 
04.
42 
05.
 
06.
>echo %random% 
07.
42
... toller Plan...
Aber sobald du deine "lokale Privat-Übersteuerung" der im CMD.exe-Environment immer vorhandenen %random%-Variablen wegknallst...
01.
>set random=
... und die "Überlagerung" weg ist, dann siehst du wieder den eigentlichen Zustand.
01.
>echo %random% 
02.
24795 '-- bzw. irgendein anderer Zufallswert >=0 <=32000irgendwas
Aber, wie geschrieben, es ist mir auch nicht so wichtig.
Selbst mit falscher Herleitung würde ja mein Workaround dem didie08 bei seinem begrenzten Problem nicht schaden.

Grüße
Biber
Bitte warten ..
Mitglied: didie08
02.02.2010 um 13:31 Uhr
Hallo,

Vielen Dank für eure engagierte Hilfe

Mit folgendem Code ist mein Problem gelöst.

01.
for /f "tokens=1,2,3,4 delims= " %%i in ('findstr "name" text1.txt') do ( 
02.
	findstr "%%j" text2.txt >nul 
03.
	if ERRORLEVEL 1 echo  %%i %%j %%k %%l>>text2.txt 
04.
)
Gruß
didie08
Bitte warten ..
Mitglied: bastla
02.02.2010 um 15:08 Uhr
Hallo (auch an alle, die nicht von Google hierher geführt wurden )!

Nur als Ergänzung:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
echo So nicht: 
04.
for %%i in (B: C:) do ( 
05.
    dir %%i >nul 2>&1 
06.
    if %errorlevel% neq 0 (echo Fehler) else (echo OK) 
07.
08.
 
09.
echo\ 
10.
echo ... aber so 
11.
for %%i in (B: C:) do ( 
12.
    dir %%i >nul 2>&1 
13.
    if !errorlevel! neq 0 (echo Fehler) else (echo OK) 
14.
15.
 
16.
echo\ 
17.
echo ... oder so 
18.
for %%i in (B: C:) do ( 
19.
    dir %%i >nul 2>&1 
20.
    if errorlevel 1 (echo Fehler) else (echo OK) 
21.
22.
 
23.
echo\ 
24.
echo ... oder auch so 
25.
for %%i in (B: C:) do ( 
26.
    dir %%i >nul 2>&1 || (echo Fehler) && (echo OK) 
27.
)
Das Beispiel bekommt die größte Aussagekraft, wenn es kein Laufwerk B: gibt.

[Edit] Letzte Variante benötigt umgekehrte Schreibweise - siehe unten ... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Biber
02.02.2010 um 16:05 Uhr
Moin bastla,

na, wenn denn so viele Such-MaschinistInnen hier erwartet werden, dann sollten wir denen ja was bieten.

Dann noch eine kleine Fussnote.
Wenn ich deinen Lehrschnipsel so hin drehe, dass auch die Interessierten mit vorhandenem B:-Laufwerk was zum Staunen haben und zum Testen das Laufwerk @:\ abprüfe:
01.
:: -- bastlasEL.cmd Demoschnipsel für Errorlevel-Abfrage 
02.
@echo off & setlocal enabledelayedexpansion 
03.
:: --- geprüft werden immer die Laufwerke @:\ [nicht da] und C: ["immer" da] 
04.
echo So nicht: 
05.
for %%i in (@: C:) do ( 
06.
    dir %%i >nul 2>&1 
07.
    if %errorlevel% neq 0 (echo %%i Fehler) else (echo %%i OK) 
08.
09.
 
10.
echo\ 
11.
echo ... aber so 
12.
for %%i in (@: C:) do ( 
13.
    dir %%i >nul 2>&1 
14.
    if !errorlevel! neq 0 (echo %%i Fehler) else (echo %%i OK) 
15.
16.
 
17.
echo\ 
18.
echo ... oder so 
19.
for %%i in (@: C:) do ( 
20.
    dir %%i >nul 2>&1 
21.
    if errorlevel 1 (echo %%i Fehler) else (echo %%i OK) 
22.
23.
 
24.
echo\ 
25.
echo ... oder auch so 
26.
for %%i in (@: C:) do ( 
27.
    dir %%i >nul 2>&1 || (echo %%i Fehler) && (echo %%i OK) 
28.
)
.... dann ist die Ausgabe wie folgt:
>BastlasEL.bat 
So nicht: 
@: OK 
C: OK 
 
... aber so 
@: Fehler 
C: OK 
 
... oder so 
@: Fehler 
C: OK 
 
... oder auch so 
@: Fehler 
@: OK
-----> Bitte auf die letzten beiden Ausgabezeilen achten!!
Die Prüfung "machWas || aktionWennTilt && AktionWennWeAreTheChampions" sieht zwar elegant (und sinnhaft!) aus,
aber fällt leider in die Kategorie works as designed...
Mit "||" bzw "&&" lässt sich (soweit ich es benutze) immer nur eins von beiden prüfen.
Wenn der CMD-Interpreter feststellt, dass die Fehlerprüfung "||" in Zeile 26 NICHT gilt, dann schaut er auch nicht weiter nach rechts, ob da noch ein "&&" folgt.
Das macht er nur, WENN ein Fehler aufftrat... und dann macht er ZUSÄTZLICH die Anweisung rechts des "&&".

Grüße
Biber
Bitte warten ..
Mitglied: bastla
02.02.2010 um 17:19 Uhr
@Biber

Na dann machen wir's doch so (und ich wollte es ohnehin schon vorhin umdrehen *grummel*):
01.
echo ... oder doch so  
02.
for %%i in (@: C:) do (  
03.
    dir %%i >nul 2>&1 && (echo %%i OK) || (echo %%i Fehler) 
04.
)
Dann wird ein schönes "If - Then - Else" mit folgendem Ergebnis
... oder doch so 
@: Fehler 
C: OK
draus ...
BTW: Wo ist denn vorhin das "C:" geblieben?
@: Fehler  
@: OK
Grüße
bastla
Bitte warten ..
Mitglied: Biber
02.02.2010 um 21:31 Uhr
Moin bastla,

Zitat von bastla:
BTW: Wo ist denn vorhin das "C:" geblieben?
@: Fehler  
@: OK
Na, probier doch den von mir geposteten Schnipsel mal ... das ist wirklich die Original-Demo-Ausgabe.

Interpretation:
Fall a) Wenn das Nicht-Laufwerk @:\ geprüft wird kommt ZUERST das "|| (echo %%i Fehler)" UND DANN das "&& (echo %%i OK)"
In Summe
@: Fehler  
@: OK
Fall b) Wenn das IstDa-Laufwerk C:\ geprüft wird kommt ZUERST NICHT das "|| (echo %%i Fehler)" UND DANN AUCH NICHT das "&& (echo %%i OK)"

In Summe
{ Näherungswert für FDP-Wirtschaftskompetenz }
Grüße
Biber
Bitte warten ..
Mitglied: bastla
02.02.2010 um 22:04 Uhr
@Biber
OK, Nachmittagstief vorbei - ist klar ...
das ist wirklich die Original-Demo-Ausgabe.
hätte ich auch nie nicht angezweifelt ...

Aber die umgekehrte Variante
dir %%i >nul 2>&1 && (echo %%i OK) || (echo %%i Fehler)
tut bei mir tatsächlich, was sie soll.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
02.02.2010 um 22:17 Uhr
Moin bastla,

Zitat von bastla:
@Biber
OK, Nachmittagstief vorbei - ist klar ...
Tja, wenn die Montage manchmal etwas länger dauern... kenn ich.
Aber die umgekehrte Variante ... tut bei mir tatsächlich, was sie soll.

Na ja sagen wir lieber... works as designed...

Wenn du das Konstrukt so formulierst...
dir %%i >nul 2>&1 && (echo %%i OK) || (echo %%i Fehler)
...dann kann ja der "||"-Zweig nur erreicht werden, falls die unmittelbar davor ausgeführte "echo %%i OK"-Anweisung einen Fehlerwert zurückliefert.

Denn es ist kein IF..THEN..ELSE, sondern ein "Lies & mach nur weiter, Wenn HIER Errorlevel 0" (=&&) bzw. "lies und mach nur weiter, wenn HIER Errorlevel<>0" (=||).
[edit]
BullShit.... Theorie wurde schnell widerlegt... siehe unten.
[/edit]

Da diese Wahrscheinlichkeit doch eher zu vernachlässigen ist... hmm...
... ich denke, das "|| (echo %%i Fehler)" kann eigentlich nur bei plötzlichem Meteoriteneinschlag erreicht werden.
Ich würde es (wegen der Lesbarkeit) gleich ganz weg lassen.

Grüße
Biber

P.S. Jezz' haben die GooglerInnen aber wirklich was zu lesen....
Bitte warten ..
Mitglied: bastla
02.02.2010 um 22:25 Uhr
@Biber
... ich denke, das "|| (echo %%i Fehler)" kann eigentlich nur bei plötzlichem Meteoriteneinschlag erreicht werden.
Ach so, hatte mich schon über den Krach vorhin gewundert ...

Aber ernsthaft: Welche andere Erklärung hättest Du noch für die (ebenfalls originale) Ausgabe
... oder doch so  
@: Fehler  
C: OK
Grüße
bastla
Bitte warten ..
Mitglied: Biber
02.02.2010 um 22:38 Uhr
Tja, bastla,

das hatte ich fast schon befürchtet, dass unsere Rechner unterschiedliche Ergebnisse liefern.

Mein reduzierter Demo-Schnipsel mit aktuellem Ausgabe-Ergebnis als letzte Codezeilen (ab Zeile 32 nach dem "goto :eof")..
01.
:: -- bastlasEL.cmd Demoschnipsel für Errorlevel-Abfrage 
02.
@echo off  
03.
:: & setlocal enabledelayedexpansion 
04.
goto :theLast 
05.
echo So nicht: 
06.
for %%i in (@: C:) do ( 
07.
    dir %%i >nul 2>&1 
08.
    if %errorlevel% neq 0 (echo %%i Fehler) else (echo %%i OK) 
09.
10.
 
11.
echo\ 
12.
echo ... aber so 
13.
for %%i in (@: C:) do ( 
14.
    dir %%i >nul 2>&1 
15.
    if !errorlevel! neq 0 (echo %%i Fehler) else (echo %%i OK) 
16.
17.
 
18.
echo\ 
19.
echo ... oder so 
20.
for %%i in (@: C:) do ( 
21.
    dir %%i >nul 2>&1 
22.
    if errorlevel 1 (echo %%i Fehler) else (echo %%i OK) 
23.
24.
 
25.
echo\ 
26.
echo ... oder auch so 
27.
:TheLast Anmerkung Lw. C: und D: existieren; @: und V: nicht 
28.
for %%i in (@: C: D: V:) do ( 
29.
    dir %%i >nul 2>&1 || (echo %%i Fehler) && (echo %%i OK) 
30.
31.
goto :eof 
32.
Ausgabe: 
33.
(=22:31:56  D:\temp=) 
34.
>BastlasEL.bat 
35.
@: Fehler 
36.
@: OK 
37.
V: Fehler 
38.
V: OK 
39.
(=22:34:07  D:\temp=)
Von Laufwerk C: und D: ist nix zu sehen, nix zu hören...
XP Prof SP3, handelsübliche Client-Config... mehr hab ich nicht getestet.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
02.02.2010 um 22:49 Uhr
Hallo Biber!

Deine Zeile 29 sollte so aussehen:
dir %%i >nul 2>&1 && (echo %%i OK) || (echo %%i Fehler)
Bei mir übrigens erfolgreich unter
  • XP Pro SP2
  • Uralt-Vista aus der VM
  • W7 Pro, kein SP

Grüße
bastla
Bitte warten ..
Mitglied: Biber
02.02.2010 um 22:58 Uhr
Okay, okay, bastla,

ich nehme alles zurück (auch alle Meteoriten-Theorien) und bestätige deine Test auch für Win XP Pro SP3.

>BastlasEL 
@: tilt 
C: OK 
D: OK 
V: tilt
Jetzt kommen wir bestimmt in die Top-Ten-Beiträge mit einem Thread, der seit heute mittag auf "Erledigt" steht...

Grüße
Biber
Bitte warten ..
Mitglied: bastla
02.02.2010 um 23:06 Uhr
Hallo Biber!
Jetzt kommen wir bestimmt in die Top-Ten-Beiträge
Huch, wenn der Google-Bot das auch noch mitbekommt ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...