Zum Inhalt wechseln


Foto

Batch Datei Problem


  • Bitte melde dich an um zu Antworten
12 Antworten in diesem Thema

#1 Sascha321

Sascha321

    Board Veteran

  • 580 Beiträge

 

Geschrieben 10. Juli 2017 - 19:13

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


#2 Sanches

Sanches

    Newbie

  • 423 Beiträge

 

Geschrieben 10. Juli 2017 - 21:37

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



#3 lefg

lefg

    Expert Member

  • 20.480 Beiträge

 

Geschrieben 11. Juli 2017 - 06:06

 

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?


Das Messbare messen, das Nichtmessbare messbar machen. Galilei.

 

Diskutiere nicht mit ***en, denn sie ziehen dich auf ihr Niveau und schlagen dich dort mit Erfahrung! (Hab ich bei Tom abgeguckt)

 

Koinzidenz begründet keine Korrelation und ist kein Beweis für Kausalität. (Hab ich bei Daniel abgeguckt) https://de.wikipedia...rgo_propter_hoc

 

Absolutistischer“ Geschäftsführungs-Dogmatismus, der jedwede Empirie aus der „Werkstatt“ schlichtweg ignoriert , führt eben zumeist früher als später ….  (Hab ich von Klabautermann)


#4 Sascha321

Sascha321

    Board Veteran

  • 580 Beiträge

 

Geschrieben 11. Juli 2017 - 09:38

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


#5 lefg

lefg

    Expert Member

  • 20.480 Beiträge

 

Geschrieben 11. Juli 2017 - 10:30

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


Bearbeitet von lefg, 11. Juli 2017 - 10:34.

Das Messbare messen, das Nichtmessbare messbar machen. Galilei.

 

Diskutiere nicht mit ***en, denn sie ziehen dich auf ihr Niveau und schlagen dich dort mit Erfahrung! (Hab ich bei Tom abgeguckt)

 

Koinzidenz begründet keine Korrelation und ist kein Beweis für Kausalität. (Hab ich bei Daniel abgeguckt) https://de.wikipedia...rgo_propter_hoc

 

Absolutistischer“ Geschäftsführungs-Dogmatismus, der jedwede Empirie aus der „Werkstatt“ schlichtweg ignoriert , führt eben zumeist früher als später ….  (Hab ich von Klabautermann)


#6 Sascha321

Sascha321

    Board Veteran

  • 580 Beiträge

 

Geschrieben 11. Juli 2017 - 16:28

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

 



#7 lefg

lefg

    Expert Member

  • 20.480 Beiträge

 

Geschrieben 11. Juli 2017 - 18:39

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, 11. Juli 2017 - 18:42.

Das Messbare messen, das Nichtmessbare messbar machen. Galilei.

 

Diskutiere nicht mit ***en, denn sie ziehen dich auf ihr Niveau und schlagen dich dort mit Erfahrung! (Hab ich bei Tom abgeguckt)

 

Koinzidenz begründet keine Korrelation und ist kein Beweis für Kausalität. (Hab ich bei Daniel abgeguckt) https://de.wikipedia...rgo_propter_hoc

 

Absolutistischer“ Geschäftsführungs-Dogmatismus, der jedwede Empirie aus der „Werkstatt“ schlichtweg ignoriert , führt eben zumeist früher als später ….  (Hab ich von Klabautermann)


#8 MurdocX

MurdocX

    Board Veteran

  • 556 Beiträge

 

Geschrieben 12. Juli 2017 - 06:02

Es gäbe eine Möglichkeit das mit weniger Zeilen zu bauen. Interesse? ;-)

Mit freundlicher Unterstützung
Jan


#9 Sascha321

Sascha321

    Board Veteran

  • 580 Beiträge

 

Geschrieben 12. Juli 2017 - 12:49

Hallo

 

Ja natürlich habe ich Interesse, ich möchte ja gerne verstehen was da passiert und warum das nicht geht :-)



#10 daabm

daabm

    Expert Member

  • 2.110 Beiträge

 

Geschrieben 20. Juli 2017 - 23:21

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.


Greetings/Grüße, Martin

Mal ein gutes Buch über GPOs lesen? Oder ein kleines, aber feines Blog darüber?

Und wenn mir die IT mal auf die Nerven geht - coke bottle design refreshment (-:


#11 NilsK

NilsK

    Expert Member

  • 12.334 Beiträge

 

Geschrieben 21. Juli 2017 - 05:46

Moin,

Das Stichwort ist delayed expansion. Du musst die Variable dann anders notieren.

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#12 lefg

lefg

    Expert Member

  • 20.480 Beiträge

 

Geschrieben 21. Juli 2017 - 06:21

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, 21. Juli 2017 - 06:18.

Das Messbare messen, das Nichtmessbare messbar machen. Galilei.

 

Diskutiere nicht mit ***en, denn sie ziehen dich auf ihr Niveau und schlagen dich dort mit Erfahrung! (Hab ich bei Tom abgeguckt)

 

Koinzidenz begründet keine Korrelation und ist kein Beweis für Kausalität. (Hab ich bei Daniel abgeguckt) https://de.wikipedia...rgo_propter_hoc

 

Absolutistischer“ Geschäftsführungs-Dogmatismus, der jedwede Empirie aus der „Werkstatt“ schlichtweg ignoriert , führt eben zumeist früher als später ….  (Hab ich von Klabautermann)


#13 MurdocX

MurdocX

    Board Veteran

  • 556 Beiträge

 

Geschrieben 21. Juli 2017 - 06:34

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

Mit freundlicher Unterstützung
Jan