Sascha321 12 Geschrieben 10. Juli 2017 Melden Teilen Geschrieben 10. Juli 2017 Hallo zusammen Ich habe mal eine Frag zu einem Batch File. In der ersten for Schleife, werden alle Laufwerk vom Computer geholt und in die Variable %%a geschrieben. Das ist mir soweit klar. Was mir nicht klar ist, warum ich die Variable %%a mit dem echo Befehl unter der zweiten for Schleife nicht ausgeben kann. Um ehrlich zu sein, versteh ich die zweite for Schleife nicht. Kann mir da jemand helfen? cls @echo off setlocal EnableDelayedExpansion set zaehler=0 set Laufwerksbuchstabe = for /f "skip=1 tokens=1,2,3 delims==" %%a in ('"wmic logicaldisk get deviceid, volumename, description"') do ( set /a zaehler^=!zaehler!+1 set Var!zaehler!^=%%a ) for /L %%a in (1,1,%zaehler%) do (if not "!Var%%a!"=="" echo %%a = !Var%%a!) echo %%a pause Zitieren Link zu diesem Kommentar
Sanches 22 Geschrieben 10. Juli 2017 Melden Teilen Geschrieben 10. Juli 2017 Hi, ich würde an deiner Stelle die 2. FOR-Schleife umbauen, sodass das letzte echo auch innerhalb der FOR-Schleife liegt. Somit sollte dann auch die gewünschte Anzeige klappen. Da lediglich in der 2. FOR-Schleife deine Ausgaben sind, wird sie wohl für die Anzeige der Daten dienen. Ansonsten einfach mal ...: FOR /? Gruß Sebastian Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 11. Juli 2017 Melden Teilen Geschrieben 11. Juli 2017 warum ich die Variable %%a mit dem echo Befehl unter der zweiten for Schleife nicht ausgeben kann. Mioin Dann ist die Variable leer Wozu soll das Ganze gut sein? Zitieren Link zu diesem Kommentar
Sascha321 12 Geschrieben 11. Juli 2017 Autor Melden Teilen Geschrieben 11. Juli 2017 Hallo Ich möchte damit einen USB stick auswählen können und dann mit Diskpart weiter bearbeiten können. Aber ich glaube wir reden da an einander vorbei. cls @echo off setlocal EnableDelayedExpansion set zaehler=0 set Laufwerksbuchstabe = for /f "skip=1 tokens=1,2,3 delims==" %%a in ('"wmic logicaldisk get deviceid, volumename, description"') do ( set /a zaehler^=!zaehler!+1 set Var!zaehler!^=%%a ) for /L %%a in (1,1,%zaehler%) do (if not "!Var%%a!"=="" echo %%a = !Var%%a!) <--- hier klappt die ausgabe mit dem echo echo %%a <-- hier klappt sie nicht pause Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 11. Juli 2017 Melden Teilen Geschrieben 11. Juli 2017 (bearbeitet) Die Schleife ist beendet, in der Schleife verwendete Variable werden nicht mit aus der Schleife genommen zur nächen Anweisung. bearbeitet 11. Juli 2017 von lefg Zitieren Link zu diesem Kommentar
Sascha321 12 Geschrieben 11. Juli 2017 Autor Melden Teilen Geschrieben 11. Juli 2017 cls @echo off setlocal EnableDelayedExpansion set zaehler=0 set Laufwerksbuchstabe = for /f "skip=1 tokens=1,2,3 delims==" %%a in ('"wmic logicaldisk get deviceid, volumename, description"') do ( set /a zaehler^=!zaehler!+1 set Var!zaehler!^=%%a ) echo %%a <--- keine Augabe cls @echo off setlocal EnableDelayedExpansion set zaehler=0 set Laufwerksbuchstabe = for /f "skip=1 tokens=1,2,3 delims==" %%a in ('"wmic logicaldisk get deviceid, volumename, description"') do ( set /a zaehler^=!zaehler!+1 set Var!zaehler!^=%%a ) for /L %%a in (1,1,%zaehler%) do (if not "!Var%%a!"=="" echo %%a = !Var%%a!) <--- hier klappt die ausgabe pause Kann mir jemand erklären warum die Ausgabe mit dem ersten Skript klappt und mit dem zweiten nicht? Es steht beides mal echo %%a in den Zeilen und trotzdem wird es nur bei der For schleife ausgegeben. Die Schleife ist beendet, in der Schleife verwendete Variable werden nicht mit aus der Schleife genommen zur nächen Anweisung. Das stimmt nicht, die Variable %%a wird doch von der ersten For schleife gefüllt, und von der zweiten For Schleife wieder ausgegeben. Kann mir das den keiner erklären? Gruss Sascha Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 11. Juli 2017 Melden Teilen Geschrieben 11. Juli 2017 (bearbeitet) Ob Du in der zweiten Schleife auch ein set verwenden könntest? In der ersten Schleife geschieht das set innerhalb der Schleife. Es ist bei mir schon länger her mit dieser Schleifenprogrammierung. bearbeitet 11. Juli 2017 von lefg Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 12. Juli 2017 Melden Teilen Geschrieben 12. Juli 2017 Es gäbe eine Möglichkeit das mit weniger Zeilen zu bauen. Interesse? ;-) Zitieren Link zu diesem Kommentar
Sascha321 12 Geschrieben 12. Juli 2017 Autor Melden Teilen Geschrieben 12. Juli 2017 Hallo Ja natürlich habe ich Interesse, ich möchte ja gerne verstehen was da passiert und warum das nicht geht :-) Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 20. Juli 2017 Melden Teilen Geschrieben 20. Juli 2017 Powershell wäre wohl die Lösung - es gibt einfach Dinge, die per Batch nur "saublöd" zu realisieren sind. Und %%a ist eine Schleifenvariable, die steht außerhalb NICHT zur Verfügung. Du hast 2 Schleifen, die die gleiche Variable verwenden, das hat aber NICHTS miteinander zu tun. Deine 2. Schleife befüllt die Variable neu. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 21. Juli 2017 Melden Teilen Geschrieben 21. Juli 2017 Moin, Das Stichwort ist delayed expansion. Du musst die Variable dann anders notieren. Gruß, Nils Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 21. Juli 2017 Melden Teilen Geschrieben 21. Juli 2017 (bearbeitet) cls @echo off setlocal EnableDelayedExpansion Diese Art der Schleife mit der %% ist nicht so einfach zu verstehen und auch nicht leicht verständlich zu erläutern. Ich könnte das nur mit mehreren Lehr- und Lernbeispielen aufbauen. Es gab mal eine ganz gute Erläuterung zu dem Thema von einem BB - Berhard Barns(?), es ist sehr lange her, leider nicht mehr auffindbar. Die erste Abschnitt scheint ja zufriedenstellend zu funktionieren, mit set Var!zaehler!^=%%a wird der Inhalt von %%a mit set einer anderen Variable zugewiesen. Im zweiten Abschnitt in der andern Schleife geschieht das nicht. Die Variable %% ist eine Schleifenvariable, nur darin gültig, wird bei Abarbeitung der Schleife bis zum Ende verworfen. Ein Trick ist, die Schleife vor Ende mit einem Sprung zu verlassen. Ein weiterer, alles weitere in der Schleife selbst abzuarbeiten. Nicht ohne Grund wurde die Batchprogrammierung von MS quasi abgeschafft und Powershell eingeführt. bearbeitet 21. Juli 2017 von lefg Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 21. Juli 2017 Melden Teilen Geschrieben 21. Juli 2017 Hallo Ja natürlich habe ich Interesse, ich möchte ja gerne verstehen was da passiert und warum das nicht geht :-) Powershell wäre wohl die Lösung - es gibt einfach Dinge, die per Batch nur "saublöd" zu realisieren sind. Und %%a ist eine Schleifenvariable, die steht außerhalb NICHT zur Verfügung. Du hast 2 Schleifen, die die gleiche Variable verwenden, das hat aber NICHTS miteinander zu tun. Deine 2. Schleife befüllt die Variable neu. Ich hätte die Erinnerungsmail nicht so schnell löschen sollen... Powershell wäre die "Lösung" gewesen auf die ich hinweisen wollte :) Den Abruf der Laufwerke könnte so aussehen: $objLwList = Get-WmiObject -Class Win32_LogicalDisk -Property deviceid, Name, description | Select-Object Name,DeviceId,Description Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.