Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: didie08

didie08 (Level 1) - Jetzt verbinden

02.02.2010 um 11:15 Uhr, 10952 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 ..
Ähnliche Inhalte
Batch & Shell
Problem mit "findstr"
Frage von KoronicBatch & Shell1 Kommentar

Hallo, ich versuche momentan eine Datei in einem Bild zu "verstecken". Dazu habe ich ein Tool gefunden, was die ...

Batch & Shell
Nur findstr Erstfund ausgeben
gelöst Frage von neusterBatch & Shell18 Kommentare

Bin komplett neu hier und kenne mich überhaupt nicht aus. Kann man mit dem Befehl findstr auch nur den ...

Windows Tools
Findstr und regex
gelöst Frage von tobmesWindows Tools5 Kommentare

Hi Experten, ich habe ziemlich viele PDF-Dateien, die ich mittels eines Batch-Files nach einem Bestimmten Muster durchsuchen möchte. Die ...

Batch & Shell

Win10 ändert den Errorlevel? ( Batch )

gelöst Frage von clragonBatch & Shell12 Kommentare

Hey Leute, Ich habe heute wieder mit Prozessen herumgebastelt, die sich gegenseitig überwachen. Da plötzlich, habe ich einen Fehler. ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 4 TagenWindows 72 Kommentare

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 6 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 7 TagenMicrosoft Office9 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 9 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Notebooks in Firmenwlan authentifizieren
gelöst Frage von EarthShakerLAN, WAN, Wireless17 Kommentare

Guten Tag, unsere Firma möchte gerne flächendeckend WLAN einführen und hat zu diesem Zweck einen Dienstleister beauftragt. Wir benötigen ...

Peripheriegeräte
PS2 Y-Kabel für Maus+Tastatur an PS2 Combo-Anschluss ASUS Prime X370-A
gelöst Frage von Windows10GegnerPeripheriegeräte13 Kommentare

Hallo, ich bin am Überlegen das o.g. Motherboard anzuschaffen. Da ich aber noch PS/2 für Maus+Tastatur benötige (bei optischen ...

Windows 10
Netzlaufwerk verschwindet (aber nur bestimmter Laufwerksbuchstabe)
gelöst Frage von survial555Windows 1010 Kommentare

Hallo, ich habe ein ganz seltsames Problem. Systemumgebung: Server 2012 R2 als DC und Windows 10 Pro als Clients ...

Netzwerkmanagement
Netzwerk vorübergehend weg
Frage von ahstaxNetzwerkmanagement10 Kommentare

Hallo, folgendes Szenario stellt sich dar: Im Netzwerk mit Win7-PCs wurden Switche ausgetauscht. Grundsätzlich funktioniert alles mindestens so gut ...