wmenzel
Goto Top

Windows 10 Batch: Wie in FOR-Schleife Befehlsausgabe in Variable?

@echo off
setlocal enabledelayedexpansion
set Drive=
FOR %%f IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO if exist %%f:\ (
fsutil fsinfo driveType %%f:
pause
)

Gibt z.B.: unter anderem den String (Text)
C: - Eingebautes Laufwerk
am Bildschirm aus.

Die FOR-Schleife gibt für jeden vorhandenen Laufwerksbuchstaben nacheinander einen derartigen String aus.


Frage:
Wie bekomme ich diesen String innerhalb des zweiten Klammerpaares in die Text-Variable Drive?


Hinweis:
In bzw. ab Zeile 6 stehen mehrere weitere Befehle.
Das “pause“ ist hier nur ein Platzhalter.
An dieser Stelle muss der jeweilige String (im Beispiel „C: - Eingebautes Laufwerk“ in der temporären Text-Variablen Drive gespeichert werden.

Hintergrund meiner Frage:
Dies Variable Drive muss ich innerhalb des zweiten Klammerpaares jeweils zwei mal hintereinander „bearbeiten“.
Der Text ab dem 6-ten Zeichen muss innerhalb des zweiten Klammerpaares mit IF ausgewertet werden.
Wenn die Bedingung erfüllt ist,
werden die ersten zwei Zeichen der Variablen Drive innerhalb des zweiten Klammerpaares für einen weiteren Befehl als Parameter benötigt.


Mein Problem:
Ich bekomme den String innerhalb des zweiten Klammerpaares nicht in die Variable Drive.
Syntax-Problem!


Ich bedanke mich im Voraus für Hilfe - den Code.

Dies ist meine erste Frage.
Sollte ich diese in der falschen Kategorie gestellt haben, bitte Hinweis und verschieben.

Content-ID: 2361873801

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

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

NikosLykos
NikosLykos 31.03.2022 um 20:43:03 Uhr
Goto Top
Hallo,

hier etwas Hilfe zur Selbsthilfe:

ss64.com (FOR /F)

Viel Spaß beim Dazulernen!


NikosLykos
WMenzel
WMenzel 01.04.2022 um 06:36:39 Uhr
Goto Top
Hallo NikosLykos,

das einzige was ich - mit meinem Wissen -
zu meiner konkreten Frage aus deinem Link herauslesen konnte, ist
"To put the Windows Version into an environment variable"
SET Drive=%%f
Das hatte ich schon in diversen Varianten erfolglos getestet!

Für den Fall, dass mein Variablen-Name Problemen macht, habe ich diesen vorsichtshalber geändert:

@echo off
setlocal enabledelayedexpansion
set LW_Info=
FOR %%f IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO if exist %%f:\ (
ECHO Die naechste Zeile zeigt an, was fsutil fsinfo driveType %%f: ausgibt
fsutil fsinfo driveType %%f:
SET LW_Info=%%f
ECHO LW_Info = %LW_Info%
pause
)
pause
exit

Bildschimausgabe:
Die naechste Zeile zeigt an, was fsutil fsinfo driveType C: ausgibt
C: - Eingebautes Laufwerk
LW_Info =
Drücken Sie eine beliebige Taste . . .

Der SET Befehl innerhalb des zweiten Klammerpaares
- so wie ich ihn geschrieben habe -
scheibt NICHTS in die Variable LW_Info!
(Zumindest kein am Bildschirm sichtbares Zeichen.)
NikosLykos
NikosLykos 01.04.2022 um 11:40:12 Uhr
Goto Top
Hallo MWenzel,

deine konkrete Frage war
Mein Problem:
Ich bekomme den String innerhalb des zweiten Klammerpaares nicht in die Variable Drive.
Syntax-Problem!

Auf der verlinkten Seite ist zu lesen:
The FOR /F command is the answer to innumerable questions where you want to take the output of some command, store it in a variable, then do something with the result.
Außerdem:
FOR /F processing of a command consists of reading the output from the command one line at a time and then breaking the line up into individual items of data or 'tokens'. The DO command is then executed with the parameter(s) set to the token(s) found.

Ich gehe davon aus, dass du Englisch verstehst, ansonsten kann man die Seite auch übersetzen.

Weiterhin solltest du bei der Verwendung von Variablen in Schleifen folgendes beachten:
EnableDelayedExpansion / FOR Loops


NikosLykos
colinardo
colinardo 01.05.2022 aktualisiert um 19:49:26 Uhr
Goto Top
Servus,
das kann man zwar über die Ausgabe von fsutil machen, ist aber aus einem guten Grund unzuverlässig: Es ist sprachabhängig. Den Datenträger-Typ bekommst du per Batch sprachunabhängig besser gleich über WMI
@echo off &setlocal enabledelayedexpansion
FOR %%a IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO if exist %%a: (
	for /f "tokens=2 delims==" %%b in ('wmic logicaldisk where "DeviceId = '%%a:'" get DriveType /value') do for /f "delims=" %%c in ("%%b") do set drivetype=%%c  
	if "!drivetype!" == "0" echo Laufwerk %%a: ist vom Typ "unbekannt"  
	if "!drivetype!" == "1" echo Laufwerk %%a: ist vom Typ "Kein Stammverzeichnis"  
	if "!drivetype!" == "2" echo Laufwerk %%a: ist vom Typ "Wechseldatentraeger"  
	if "!drivetype!" == "3" echo Laufwerk %%a: ist vom Typ "Lokaler Datentraeger"  
	if "!drivetype!" == "4" echo Laufwerk %%a: ist vom Typ "Netzlaufwerk"  
	if "!drivetype!" == "5" echo Laufwerk %%a: ist vom Typ "Compact Disc"  
	if "!drivetype!" == "6" echo Laufwerk %%a: ist vom Typ "RAM-Datentraeger"  
)
https://docs.microsoft.com/de-de/windows/win32/cimwin32prov/win32-logica ...

Willst du warum auch immer bei der fsutil Variante bleiben auch das geht natürlich wenn auch der Nachteil der Sprachlokalisation für einen Vergleich bleibt.
@echo off &setlocal enabledelayedexpansion
FOR %%a IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO if exist %%a: (
    set "drive=%%a:"  
    for /f "tokens=1,* delims=- " %%b in ('fsutil fsinfo drivetype %%a:') do set "drivetype=%%c"  
    echo Laufwerk !drive! ist vom Typ "!drivetype!"  
)

Grüße Uwe