Jump to content
Melde dich an, um diesen Inhalt zu abonnieren  
Sascha321

Batch Datei Problem

Empfohlene Beiträge

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

 

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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Die Schleife ist beendet, in der Schleife verwendete Variable werden nicht mit aus der Schleife genommen zur nächen Anweisung.

bearbeitet von lefg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von lefg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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 von lefg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesen Inhalt zu abonnieren  

×