hipfzwirgel
Goto Top

Ausgabe der einzelnen Ergebnisse einer For-Schleife mit Schalter F

Hallo Leute,

besteht die Möglichkeit die Ergebnisse einer For-Schleife(Batch/CMD) in eine für jeden Durchgang erzeugte Variable zu speichern.

Beispiel:

FOR /f "tokens=2  delims==" %%A IN ('WMIC /NameSpace:"\\root\WMI" Path BatteryStaticData Get DeviceName /Format:list') DO (  
echo %%A 
set ba=%%A
)

Die Schleife liest die Namen der verbauten Akkus eines Laptop aus. Sollte das Laptop zwei oder mehr Akkus haben, hätte ich gerne,
dass die Namen jeweils in einer Variablen gespeichert werden(z.b. %ba1%, %ba2%, usw.).

Ich bitte darum keine Vorschläge wie: "...nimm ein anderes Programm" oder eine "andere Sprache", etc. machen.
Wenn es nicht in Batch geht, hilft mir eine andere Sprache leider so wenig wie ein externes Proggi.

Content-Key: 349367

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: rubberman
rubberman 18.09.2017 aktualisiert um 18:41:02 Uhr
Goto Top
Vermutlich so:
@echo off &setlocal DisableDelayedExpansion

FOR /f "tokens=1,2* delims=:=" %%A IN ('WMIC /NameSpace:"\\root\WMI" Path BatteryStaticData Get DeviceName /value^|findstr .^|findstr /n "^"') DO (  
  for /f "delims=" %%D in ("%%C") do (  
    set /a "n=%%A"  
    set "ba%%A=%%D"  
  )
)

setlocal EnableDelayedExpansion
echo Number of batteries: %n%
for /l %%i in (1 1 %n%) do echo !ba%%i!
pause
Grüße
rubberman

EDIT Sorry, Carriage Return hing noch in der Variablen ...
Mitglied: hipfzwirgel
hipfzwirgel 19.09.2017 um 09:37:33 Uhr
Goto Top
Holla Rubberman,

habs eben getestet. Vielen Dank für die schnelle Rückmeldung. Jetzt bin ich mal ein Schritt weiter. Aber nun wird die Anzahl ausgegeben. Ich brauch aber die Namen der Akkus die in der Variablen %%A gespeichert sind. Da werd ich mal noch ein bisschen rumbasteln. Hoffentlich bekomme ich es hin.

Vielen Dank einstweilen.
Mitglied: rubberman
rubberman 19.09.2017 um 12:44:51 Uhr
Goto Top
Die Anzahl wird zusätzlich in %n% gespeichert (ich gehe davon aus dass du wissen willst wie viele Akkus gefunden wurden). Die Akku-Namen befinden sich in Variablen %ba1% bis %ban%. Die habe ich in meinem Beispiel per FOR /L Schleife ausgeben lassen. Alles eigentlich so wie du es wolltest.

Grüße
rubberman
Mitglied: hipfzwirgel
hipfzwirgel 19.09.2017 aktualisiert um 15:02:50 Uhr
Goto Top
Hallo Rubberman,

soweit konnte ich es nachvollziehen. Aber ist es nicht so, dass die Variable %ba1%, etc. nach jedem Schleifendurchgang wieder überschrieben wird?
Ich hoffte, dass die dynamisch erzeugten Variablen gespeichert bleiben. Ich bringe es nämlich nicht hin, nachdem die Schleife durch ist, die einzelnen Variablen weiter zu verwenden. Also im weiteren Programmverlauf an anderer Stelle auszugeben.
Im Prinzip so: Schleife erzeugt die Variablen und speichert sie. Andere Schleife ließt den Ladestand aus und gibt dann den Satz:
Aktueller %ba1%(=Akkuname): Ladestand ist noch blabla% hoch. Ich kann immer nur die letzte erzeugte Variable ausgeben face-sad

Das ist i. ü. die zweite Schleife:

FOR /f "tokens=2 delims==" %%A IN ('wmic path win32_battery get estimatedchargeremaining /value^|find "="') Do Echo Current %bn% charge is %%A >>%outpath%  

Ich hoffe ich konnte mein Prob verständlich erklären face-smile
Mitglied: rubberman
rubberman 19.09.2017 aktualisiert um 20:29:04 Uhr
Goto Top
Ich hoffe ich konnte mein Prob verständlich erklären face-smile
Nicht so richtig.
Also, das Schleifenkonstrukt in Zeile 3-8 im Code oben weist die Baterienamen einzelnen Variablen zu (ba1 etc.). Da wird nichts überschrieben, anderenfalls wären die Variablen in der Schleife in Zeile 12 nicht verfügbar.

Was du jetzt aber vorhast, habe ich nicht verstanden. Willst du den jeweiligen Akkus den derzeitigen Ladezustand zuordnen? Hat der Ladezustand immer dieselbe Reihenfolge wie die Batterienamen?

Wie auch immer, die Nummer für die Einzelvariablen ba... muss ja auch für die Ausgabe irgendwoher kommen. Und weil das bei der Zuweisung mittels FINDSTR /N so gut geklappt hat, weiß ich nicht warum du das nun nicht einfach wiederholst.
@echo off &setlocal DisableDelayedExpansion
set "outpath=list.txt"  

FOR /f "tokens=1,2* delims=:=" %%A IN ('WMIC /NameSpace:"\\root\WMI" Path BatteryStaticData Get DeviceName /value^|findstr .^|findstr /n "^"') DO (  
  for /f "delims=" %%D in ("%%C") do (  
    set "ba%%A=%%D"  
  )
)

setlocal EnableDelayedExpansion
>"!outpath!" (  
  FOR /f "tokens=1,2* delims=:=" %%A IN ('WMIC Path Win32_Battery Get EstimatedChargeRemaining /value^|findstr .^|findstr /n "^"') DO (  
    for /f "delims=" %%D in ("%%C") do (  
      echo Current !ba%%A! charge is %%D%%.
    )
  )
)

type "!outpath!"  
pause

Grüße
rubberman
Mitglied: hipfzwirgel
hipfzwirgel 20.09.2017 um 10:48:12 Uhr
Goto Top
Hallo Rubberman,

vielen lieben Dank für deine Hilfe. Jetzt habe ich es soweit hin bekommen. Ich konnte den Code in meine Batchdatei hinein frickeln und die Ausgabe
funktioniert. Jetzt habe ich zum Abschluss noch eine Verständnisfrage:

Ich habe noch eine If-Verzweigung eingefügt. Warum bekomme ich die Meldung das der Syntax falsch ist???
Die Echo-Ausgabe der Variablen lowbatlev wird noch ausgeführt. Dann ist Schluss. Was übersehe ich da blos? face-sad

@echo off &setlocal DisableDelayedExpansion
set "outpath=list.txt"  

FOR /f "tokens=1,2* delims=:=" %%A IN ('WMIC /NameSpace:"\\root\WMI" Path BatteryStaticData Get DeviceName /value^|findstr .^|findstr /n "^"') DO (  
  for /f "delims=" %%D in ("%%C") do (  
    set "ba%%A=%%D"  
  )
)

setlocal EnableDelayedExpansion
>"!outpath!" (  
  FOR /f "tokens=1,2* delims=:=" %%A IN ('WMIC Path Win32_Battery Get EstimatedChargeRemaining /value^|findstr .^|findstr /n "^"') DO (  
    for /f "delims=" %%D in ("%%C") do (  
      echo Current !ba%%A! charge is %%D%%. 
	  set lowbatlev=%%D
    )
  )
)

type "!outpath!"  

echo %lowbatlev%
pause
If %lowbatlev% == 10 Echo The "low battery level " %lowbatlev% "is reached. Display may go darker! " >>%outpath%  
pause
Mitglied: rubberman
rubberman 20.09.2017 um 12:51:25 Uhr
Goto Top
Hmm, bei mir funktioniert der Code ohne Probleme. Keine Ahnung. Ich würde es aber trotzdem etwas anders schreiben
If !lowbatlev! leq 10 >>"!outpath!" Echo The "low battery level" !lowbatlev!%% is reached. Display may go darker^^!  
Der LEQ Operator steht hier für "kleiner oder gleich" da du sonst bei 9% keine Meldung bekommst. Da die verzögerte Variablenerweiterung eingeschaltet ist, haben die Ausrufezeichen einen Sonderstatus und sind anders zu behandeln ...

Grüße
rubberman
Mitglied: Biber
Biber 20.09.2017 um 13:23:35 Uhr
Goto Top
[OT]

Dann sind aber zwei Vaiablen sinnvoller.
Es gibt den Grenzwert %lowbatlev%, der hart verdrahtet und konstant im Batch hinterlegt ist. Der ist definiert als 10%.
Und es gibt den %actbatlev%, den aktuellen Batterieladezustand , der in der FOR/F-Anweisung rausgefieselt wird und der 67% oder 12% oder 9% sein kann.
Dann sollte auch die Ausgabe mit beiden Infos und beiden Variablen arbeiten
... Echo The "low battery level" !lowbatlev!%% is reached (now !actbatlev!%%). Display may go darker^^!

Grüße
Biber
[/OT]
Mitglied: rubberman
Lösung rubberman 20.09.2017 um 16:27:59 Uhr
Goto Top
Hast du natürlich Recht face-wink Die eigentliche Nuss, warum das IF Statement bei @hipfzwirgel in die Hose geht, haben wir aber so vermutlich beide nicht geknackt...

Grüße
rubberman
Mitglied: hipfzwirgel
hipfzwirgel 21.09.2017 um 09:24:15 Uhr
Goto Top
Hallole,

muss ich es verstehen warum heute morgen die If-Verzweigung wieder geht, ohne das sich im Code i-was geändert hat???? jetzt macht sie sogar eine Bildschirm-Ausgabe obwohl ich die Ausgabe zu outpath umleite(mit >>outpath). Dort steht die Ausgabe auch drin. Das ist bestimmt KI von Win 10 und der Rechner will mich provozieren face-sad Hauptscache das SCript geht. Vielen lieben Dank für die Hilfe. Es soll mit reichlich Kindersegen vergolten werden.
Mitglied: rubberman
rubberman 21.09.2017 um 14:28:39 Uhr
Goto Top
Haha, nee verstehe ich auch nicht. Was die Bildschirmausgabe angeht - ich hatte ein TYPE im code um zu überprüfen was in die Datei geschrieben wird. Wenn du das rausschmeißt, dann hast du vermutlich auch keine additionelle Ausgabe mehr.

Grüße
rubberman

PS: Für "reichlich Kindersegen" habe ich schon zu viele graue Haare. Das kommt ein paar Jahre zu spät face-wink