nico1999
Goto Top

Schleifenausgabe ist leer

Hi,

da ich bisher nur einfache Android-Apps geschrieben habe, bin ich bei Batch noch relativ neu. Jedoch erscheint mir alles bisher relativ simpel und dennoch effektiv. Trotzdem bin ich nun an ein Problem gestoßen, das ich nicht zu lösen vermag. Es ist wahrscheinlich für einen langjährigen Batch-Schreiber relativ offensichtlich. Wahrscheinlich fehlt nur eine Variable, um mein Problem zu lösen, doch ich habe es, wie schon erwähnt, einfach noch nicht geschafft.
Nun, ich möchte die Ausgabe des Befehls
adb reboot bootloader
als eine Variable speichern. Wenn ich den Befehl ganz einfach mit
call adb reboot bootloader
in meine Batch-Datei schreibe, erhalte ich entweder ein sehbares Ergebnis auf meinem mit dem Computer verbundenen Smartphone oder, wenn das Smartphone vom PC nicht erkannt wird, im CMD-Fenster die Ausgabe
error: device '(null)' not found  
Wenn diese Ausgabe, die ich als Variable speichern möchte, erscheint, dann soll diese ungefähr so weitergeleitet werden:
if /i "%ausgabe%"=="error: device '(null)' not found" goto:weiter  
An sich funktioniert die gerade verwendete if Methode eigentlich immer. Das Problem hier ist nur leider, dass, wenn ich
for /f "tokens=*" %%a in ('adb reboot bootloader') do set ausgabe=%%a  
schreibe, die Ausgabe einfach leer ist. Das habe ich überprüft, indem ich einfach
echo Ausgabe: %ausgabe%
in die Batch hinzugefügt habe, ich als Ausgabe aber nur das
Ausgabe: 
erhalte und das, obwohl ich bei der oben genannten for-Schleife auch bereits die Ausgabe
error: device '(null)' not found  
im CMD-Fenster angezeigt bekomme, die ich mir erwünsche.
Ich habe auch schon versucht mit
call adb reboot bootloader > text
die Ausgabe als Datei zu speichern und diese anschließend mit
set /p ausgabe=<text
als Variable wieder zu laden, jedoch ist auch hier wieder das Problem, dass die Datei text mit der Ausgabe leer ist. Somit bin ich nun am Verzweifeln. Es wäre echt suuuper, wenn mir ein netter, erfahrener Batch-Schreiber bei meinem Problem helfen könnte. Vielen vielen lieben Dank schon mal face-smile

Mit freundlichen Grüßen
Nico

Content-Key: 291727

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

Printed on: April 25, 2024 at 01:04 o'clock

Mitglied: 122990
Solution 122990 Dec 26, 2015 updated at 10:08:02 (UTC)
Goto Top
Moin,
z.B. kompakt geschrieben so
adb reboot bootloader 2>&1 | findstr /ic:"error:" >nul && echo Fehler! || echo Alles OK!  

Der Befehl wird den Fehler nicht in StdOut sondern in StdErr ausgeben deswegen erhältst du keine Ausgabe. Das ist aber kein Problem denn man kann StdErr an StdOut umleiten mit 2>&1

Deine FOR-Schleife ist problematisch wenn die Ausgabe des Befehls mehrere Zeilen enthält, denn dann enthält deine gesetzte Variable immer nur den Wert der letzten Zeile, außer man nutzt DELAYEDEXPANSION. Aber wie gesagt, wenn Fehler nur in StdErr landen musst du wie oben die Meldung umleiten um sie verarbeiten zu können.

Gruß grexit
Member: nico1999
nico1999 Dec 26, 2015 at 10:07:23 (UTC)
Goto Top
Wow, vielen vielen Dank für deine schnelle hilfreiche Antwort. Ich habe es gleich ausprobiert und es scheint zu funktionieren. Wenn ich das richtig verstehe sucht dieser Befehl einfach nach dem Wort error. Ich frag mich nur noch, wofür das 2>&1 steht. Ansonsten echt hilfreich und hast mir mein Weihnachten gerettet ;)
Member: rubberman
rubberman Dec 26, 2015 updated at 22:15:47 (UTC)
Goto Top
Hallo nico1999.

Ich frag mich nur noch, wofür das 2>&1 steht.
Grundsätzlich werden 3 Standard-Streams für ein Konsolefenster unterschieden:
  • stdin mit Streamnummer 0 für Eingaben
  • stdout mit Streamnummer 1 für (normale) Ausgaben
  • stderr mit Streamnummer 2 für Fehlerausgaben
In deinem Fall geht es um die letzten beiden. Die Fehlermeldung wird zum stderr geschrieben. Normale Umleitungen (wie > oder |) funktionieren ohne weitere Angaben nur mit dem stdout. Ebenso wird in einer FOR /F Schleife nur das stdout verarbeitet. Das
2>&1
sorgt dafür, dass das stderr in das stdout integriert wird. Somit lässt sich auch die Fehlerausgabe verarbeiten.

Grüße
rubberman