Jump to content

Batch Datei Problem


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

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
Link zu diesem Kommentar

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
Link zu diesem Kommentar
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

 

Link zu diesem Kommentar
  • 2 Wochen später...
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
Link zu diesem Kommentar

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
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...