theuntouchable
Goto Top

Per Batch alle Laufwerkbuchstaben auslesen aber Netzlaufwerke und CD-ROM ignorieren

Hallo erstmal. Das ist mein erster Beitrag in diesem Forum, habe hier schon sehr viele nützliche Tipps gefunden und bin mittlerweile so verzweifelt das ich mich jetzt selber angemeldet habe ;)

Mein Problem ist folgendes:
Ich möchte gerne für meine Firma ein Programm schreiben, welches einem normalen User es ermöglicht bestimmte Dinge ohne großen Support zu erledigen. Dieses Programm ist in mehrere Module geteilt und komplett in Batch geschrieben.
Ein Modul heist "Driver-Check" und soll alle Laufwerke auf Fehler überprüfen. Dabei sollen aber alle Netz- und CDROM-Laufwerke ignoriert werden. Ich hatte das Script auch schon so weit das er alles gemacht hat, bis eben CD-ROM Laufwerke ignorieren.. Hab dann so lange drann rumgeschusstert bis jetzt letztendlich garnichts mehr geht.. Deshalb hier erstmal der nicht funktionierende Code:

@echo off
for %%a in (A 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 (
fsutil fsinfo volumeinfo %%a:\ >nul
ECHO %ERRORLEVEL% 1
IF NOT ERRORLEVEL 1 for /f "Tokens=3* delims=\ " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "Volumename"') do (  
	
ECHO "%%a"  
net use | find /i "%%a:" >nul  
ECHO %ERRORLEVEL% 2
IF errorlevel 1 IF %%i! NEQ ! (
fsutil fsinfo drivetype %%a|findstr /c:"Eingebautes Laufwerk"  
ECHO %ERRORLEVEL% 3
IF NOT ERRORLEVEL 1	(
IF %%a==C (
ECHO                    %%a: Windows
) else (
ECHO                    %%a: %%i
)
)
) else (
fsutil fsinfo drivetype %%a|findstr /c:"Austauschbares Laufwerk"  
ECHO %ERRORLEVEL% 4
IF NOT ERRORLEVEL 1 (
ECHO                    %%a: %%i
)
)
											
											
ECHO %ERRORLEVEL% 5
IF errorlevel 1 IF %%i!==! ECHO                    %%a: Keine Bezeichnung
)
)
pause

Leider übernimmt das hier nicht ganz meine Formatierung.. Ich schau mal das ichs noch anders hinbekomm ;)
Wenn ihr meine Fehler findet wäre ich euch echt dankbar wenn ihr sie mir auch mitteilt. Danke schon mal!

PS: Ach ja, hier der noch funktionierende Code.

for %%a in (A 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 (
	fsutil fsinfo volumeinfo %%a:\ >nul
	IF ERRORLEVEL 0 for /f "Tokens=3* delims=\ " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "Volumename"') do (  
			IF %%a==C ECHO                    %%a: Windows
			IF %%a NEQ C net use | find /i "%%a:" >NUL  
			IF errorlevel 1 IF %%i! NEQ ! ECHO                    %%a: %%i
			IF errorlevel 1 IF %%i!==! ECHO                    %%a: Keine Bezeichnung
		)
	)

Content-ID: 98837

Url: https://administrator.de/forum/per-batch-alle-laufwerkbuchstaben-auslesen-aber-netzlaufwerke-und-cd-rom-ignorieren-98837.html

Ausgedruckt am: 23.12.2024 um 00:12 Uhr

paulepank
paulepank 09.10.2008, aktualisiert am 18.10.2012 um 18:36:22 Uhr
Goto Top
Hallo TheUntouchable,

deinen Code möchte ich nicht weiter auseinandernehmen, dich aber auf meinen Beitrag in
diesem Thread hinweisen.

cu paulepank
stbewo
stbewo 09.10.2008 um 10:18:34 Uhr
Goto Top
Hi,

Du kannst (falls es sich um XP SP2 handelt) von der Eingabeaufforderung aus mit:

wmic logicaldisk where "description like 'Local Fixed Disk'" get caption

die Laufwerksbuchstaben ermitteln.

Gruß
Stefan
TheUntouchable
TheUntouchable 09.10.2008 um 10:38:07 Uhr
Goto Top
Danke für den Tipp paulepank!

Leider bekomm ich die for Schleife nicht so hin das es funktionieren würde..

for /f "skip=1 Tokens=1,2 delims=:" %%i in ('wmic logicaldisk get caption,description^|find "Lokale Festplatte"') do ECHO %%i  

Fehlermeldung:
Ungültiger GET-Ausdruck.

Führe ich den Befehl ausserhalb der for Schleife aus gibt er aber alles richtig aus..

EDIT: Danke dem Beitrag unten von stbewo weis ich nun wies richtig geht ;)
for /f "skip=1 Tokens=1" %%i in ('wmic logicaldisk where "description like 'Lokale Festplatte'" get caption') do ECHO %%i  

Mein eigentliches Problem war das ich auch USB Sticks zur Auswahl haben wollte.. Wobei ich da glaub ich jetzt drauf verzichten werde, weil die USB Sticks unserer Anwender ja nicht defragmentiert werden sollten :P

Danke für die Hilfe!
TheUntouchable
TheUntouchable 09.10.2008 um 10:39:11 Uhr
Goto Top
Leider bekomme ich bei einem PC mit SP3 die Fehlermeldung:
"Keine Instanzen verfügbar."

Edit:
So gehts ;)
wmic logicaldisk where "description like 'Lokale Festplatte" get caption
anstatt
wmic logicaldisk where "description like 'Local Fixed Disk'" get caption

Danke für den Tipp!
stbewo
stbewo 09.10.2008 um 10:57:57 Uhr
Goto Top
Genau.

Ich wollte noch schreiben, dass es natürlich von der Sprachversion abhängt.
Du hast das Rätsel gelöst face-wink

Gruß
Stefan
TheUntouchable
TheUntouchable 09.10.2008 um 11:07:21 Uhr
Goto Top
So sieht letztendlich meine Lösung jetzt aus:

for /f "skip=1 Tokens=1" %%a in ('wmic logicaldisk where "description like 'Lokale Festplatte'" get caption') do (  

for /f "Tokens=3* delims=\ " %%i in ('fsutil fsinfo volumeinfo %%a\^|find "Volumename"') do (  

IF %%a==C: ECHO %%a Windows
IF %%a NEQ C: IF %%i! NEQ ! ECHO %%a %%i
IF %%a NEQ C: IF %%i!==! ECHO %%a Keine Bezeichnung
																							
)
)

Es wird erst anch dem Laufwerkbuchstaben gesucht der eine Lokale Festplatte ist. Anschließend wird für diesen die Bezeichnung herrausgesucht. Ist es das Laufwerk C: wird ihm die Bezeichnung "Windows" zugeteilt. Ist es ein Laufwerk ohne Bezeichnung, wird ihm "Keine Bezeichnung" zugeteilt. Hat das Laufwerk eine Bezeichnung wird diese ausgegeben.

Danke nochmals für die Hilfe ;)


Jetzt hätte ich noch eine andere Frage:
Ich würde gerne bei der Ausgabe vor die Laufwerke eine Nummerierung setzten, das es zb so aussieht:

1. C: Windows
2. D: Daten
3. E: Backup

Wie müsste ich das in meine Schleifen einbauen? Das mit dem Zählen hab ich noch nicht ganz gecheckt..
paulepank
paulepank 09.10.2008 um 11:16:30 Uhr
Goto Top
Hallo TheUntouchable,

1. Stefans Lösung ist eleganter.

2. um den Ansatz
for /f "skip=1 Tokens=1,2 delims=:" %%i in ('wmic logicaldisk get caption,description^|find "Lokale Festplatte"') do ECHO %%i  
zu korrigieren, muß es heißen:
for /f "delims= " %%i in ('wmic logicaldisk get caption^,description^|findstr /i "lokale festplatte"') do echo %%i  

3. ist es nicht sehr günstig in einem Thread wieder ein neues Problem anzusprechen, dafür würde sich ein neuer Thread gut machen

cu paulepank
stbewo
stbewo 09.10.2008 um 11:16:41 Uhr
Goto Top
Da Du mit FSUTIL nach dem Volumenamen suchst, kannst Du das ganze aber auch so machen.

wmic logicaldisk where "description like 'Lokale Festplatte'" get name, caption,volumename

Gruß
Stefan
TheUntouchable
TheUntouchable 09.10.2008 um 12:41:21 Uhr
Goto Top
Funktioniert leider nicht:

for /f "skip=1 Tokens=1" %%a in ('wmic logicaldisk where "description like 'Lokale Festplatte'" get name, caption,volumename ) do echo %%a  

Bekomme wieder den schönen Fehler:
Ungültiger GET-Ausdruck.

Gebe ich aber den ins cmd ein funktionierts. Kanns sein das es daran liegt das das Laufwerk C: keinen Volumennamen hat?
paulepank
paulepank 09.10.2008 um 13:06:09 Uhr
Goto Top
Hallo,

wenn du dir meine Korrektur angesehen hättest, sollte dir zumindest die Maskierung des Komma aufgefallen sein.

cu paulepank
TheUntouchable
TheUntouchable 09.10.2008 um 13:42:28 Uhr
Goto Top
Danke für den Hinweis paulepank.

Habe das ganze jetzt wieder umgeschrieben, leider funktioniert diese Variante nicht ganz so wie ichs gern hätte.. Er gibt zwar den Laufwerkbuchstaben C: aus aber nicht den Text Windows.

@echo off
for /f "skip=1 Tokens=1,2 delims= " %%a in ('wmic logicaldisk where "description like 'Lokale Festplatte'" get caption^,volumename') do (  
IF %%b!==! (
	IF %%a==C: (
		         ECHO %%a Windows
		        )else (
		        ECHO %%a Keine Bezeichnung
		        )
	) else (
	echo %%a %%b
	)
)
pause

Das Problem ist das %%b anscheinend nicht leer ist obwohl er nichts gefunden hat.. Wenn ichs mit Echo ausgeben lasse ist es aber leer.. Ich kapiers nich =(
stbewo
stbewo 09.10.2008 um 13:55:20 Uhr
Goto Top
Bei mir funktioniert es damit.
@echo off
for /F "tokens=1,2,3 skip=1" %%a in ('wmic logicaldisk where "description like 'Lokale Festplatte'" get Name^,VolumeName') do (
IF /I "%%a"=="C:" (
ECHO %%a = Windows Laufwerk VolumeName = %%b
)else (
ECHO %%a = Weiteres Laufwerk VolumeName = %%b)
pause

Gruß Stefan
paulepank
paulepank 09.10.2008 um 14:47:49 Uhr
Goto Top
Hallo TheUntouchable,

dein Code funktioniert bei mir. Siehe hier das Ergebnis
C: WinXP
D: Daten
E: TestXP

cu paulepank
TheUntouchable
TheUntouchable 09.10.2008 um 14:53:40 Uhr
Goto Top
Das liegt daran das du dein Laufwerk C: umbenannt hast. Es heist nicht mehr Lokaler Datenträger wie bei einer Neuinstallation. Wird dieser Name nicht geändert sieht das ganze so aus:

wmic logicaldisk where "description like 'Lokale Festplatte'" get caption^,volumename

Caption VolumeName
C:

Deshalb war auch die Abfrage mit dem IF %%b!==! da, aber diese klappt irgendwie nicht..


EDIT: Ole ole ole.. Ich habs anders geschaft =)

Einfach die Zeile:
IF %%b!==! (

Durch diese hier ersetzen:
IF not defined %%b (

Und es funktioniert :D Bitte testen!
TheUntouchable
TheUntouchable 09.10.2008 um 14:55:04 Uhr
Goto Top
Danke für den Vorschlag Stefan,
leider wird in dieser Variante nicht die Bezeichnung vom Laufwerk übernommen wenn eine vorhanden ist.. Und das ist sehr wichtig damit die User wissen um welches Laufwerk es sich handelt.
paulepank
paulepank 09.10.2008 um 15:15:01 Uhr
Goto Top
Hallo,

für weitere Batchexkurse:
leere Parameter werden so gestestet.

ja es funktioniert, aber muß auf c zwangsläufig Windows sein ?
EDIT: nein es funktioniert nicht

cu paulepank
TheUntouchable
TheUntouchable 09.10.2008 um 15:25:40 Uhr
Goto Top
Danke Paulepank, diese Seite kenn ich schon =)

Ja bei uns in der Firma sind alle Laufwerke C: mit Windows installiert.

Was funktioniert denn jetzt nicht?

EDIT: Okey.. Die IF DEFINED Abfrage funktioniert nicht *seufz* langsam mag ich nich mehr =(
Biber
Biber 09.10.2008 um 18:14:36 Uhr
Goto Top
Moin,

meint ihr es so?
:: ----snipp GetLocicalDrives.bat
@echo off
for /f "skip=1 Tokens=1,2" %%a in ('wmic logicaldisk where "DriveType=3" get name^, volumename') do (  
IF "%%a"=="%SystemDrive%" (  
    ECHO %%a Windows
) else (
    IF [%%b]== (ECHO %%a Keine Bezeichnung)   else  echo %%a %%b
)
)
pause

Anmerkungen:
  • "DriveType=3" als WMIC-Bedingung finde ich sinnvoller als eine "Beschreibung LIKE 'bla'
  • IF Laufwerk == %SystemDrive% ist besser als IF Laufwerk == C:
  • und die Variable %%b lässt sich nicht mit DEFINED prüfen, weil es ja ohnehin keine Defined/Statische Variable ist.

Grüße
Biber
paulepank
paulepank 09.10.2008 um 19:59:08 Uhr
Goto Top
Moin Biber,

ich antworte mal, obwohl es nicht mein Thread ist.

meint ihr es so ?



zum einen wird bei c: immer Windows angezeigt, auch wenn das Volume einen Namen hat.
zum anderen wird bei anderen Volumes ohne Namen nichts statt "Keine Bezeichnung" angezeigt.

cu paulepank
Biber
Biber 09.10.2008 um 20:25:28 Uhr
Goto Top
Moin paulepank,

dass beim SystemDrive immer nur "Windows" angezeigt wird habe ich von oben übernommen.
Würde ich auch nicht so machen.
Den zweiten Punkt kann ich nicht bestätigen. [Edit]...weil ich ihn nicht getestet habe, siehe unten...[/Edit]

Kompromissvorschlag:
@echo off
for /f "skip=1 Tokens=1,2" %%a in ('wmic logicaldisk where "Drivetype=3" get name^, volumename') do (  
IF "%%a"=="%SystemDrive%" (  
    ECHO %%a %%b ^(Windows^)
) else (
    IF [%%b]== (ECHO %%a Keine Bezeichnung)   else  echo %%a %%b
)
)
pause
Output:
(=20:20:03  D:\temp=)
>e:\schnipsel\Logicaldrives.bat
C: System (Windows)
D: Daten
["System" und "Daten" sind die kreativen Bezeichnungen meiner C:/D:-Laufwerke]

Grüße
Biber
paulepank
paulepank 09.10.2008 um 21:06:21 Uhr
Goto Top
moin Biber,

zum 2. Punkt:

nenne doch mal kreativ D: um. Sprich: lösche die Bezeichnung "Daten".
Dann soll in der Auflistung "keine Bezeichnung" als Volumename stehen.
Das hast du bis jetzt nicht getestest.

cu paulepank
Biber
Biber 09.10.2008 um 21:27:52 Uhr
Goto Top
Mein Gott, paulepank,

Du kannst aber auch stur sein...face-wink

Aber Recht hast Du - in diesem Fall (kein Volumename-Parameter %%b geht raus) scheint M$ wieder mal die Output-Zeile nicht mit CRLF abzuschließen, sondern nur mit LF.
Oder nur mit CR. Oder mit CRCRLF Irgend so ein Praktikantenpfusch halt.
Das bringt immer den FOR/F Befehl durcheinander, kenn ich schon vom FsUtil-Befehl.

Anyhow, dann halt so.
::--- LogicalDrives.bat v03.
@echo off
for /f "skip=1 Tokens=1,2" %%a in (  
 'wmic logicaldisk where "Drivetype=3" get name^, volumename') do (  
        call :displayIt %%a %%b "Keine Bezeichnung")  
pause
goto :eof

:displayIt 
IF "%1"=="%SystemDrive%" (  
    ECHO %1 %~2 ^(Windows^)
) else (
    ECHO %1 %~2
)
Goto :eof
Output mit gelöschtem D.-Volumenamen:
(=21:20:34  D:\temp=)
>e:\schnipsel\Logicaldrives.bat
C: System (Windows)
D: Keine Bezeichnung
Drücken Sie eine beliebige Taste . . .

Besser?

Grüße
Biber
TheUntouchable
TheUntouchable 09.10.2008 um 21:41:52 Uhr
Goto Top
Guten Abend Biber und paulepank,
find ich super das ihr noch weiter macht wenn ich mir ne Auszeit gönne, danke Jungs ;)

Einen kleinen Fehler habe ich noch, aber wahrscheinlich wird das zu schwierig den zu beheben, habs selber schon probiert.

Wenn der Laufwerkname aus 2 Teilen besteht, wie zb "Windows XP", dann wird hier nur "Windows" angezeigt. Das doofe is nur das man dann kp wie viele Parameter braucht um alle Fälle abdecken zu können..

Falls euch da noch was einfallen sollte wärs spitze! Aber auch ohne diese Lösung schon mal vielen Dank für eure super Arbeit!

Viele Grüße

Michi
Biber
Biber 09.10.2008 um 21:53:28 Uhr
Goto Top
Moin Theo Tatschebell,

wenn's weiter nichts ist...
:: -----snipp LogicalDrives.bat v.04
@echo off
for /f "skip=1 Tokens=1,*" %%a in (  
 'wmic logicaldisk where "Drivetype=3" get name^, volumename') do (  
        call :displayIt %%a "%%~b" "Keine Bezeichnung")  
pause
goto :eof

:displayIt 
IF "%1"=="%SystemDrive%" (  
    ECHO %1 %~2 ^(Windows^)
) else (
    ECHO %1 %~2
)
Goto :eof

Output:
(=21:51:51  D:\temp=)
>e:\schnipsel\Logicaldrives.bat
C: System XP    (Windows)
D: Daten
Drücken Sie eine beliebige Taste . . .

Grüße
Biber
TheUntouchable
TheUntouchable 09.10.2008 um 21:55:33 Uhr
Goto Top
Hehe danke Biber, damit wär glaub ich dieses Thema abgeschlossen, du bist mein Held ;) Morgen test ichs nochmal in der Arbeit dann wirds geschlossen. Aber freu dich nicht zu früh morgen wirds nen neuen Thread geben.. :P

Gute Nacht ;)
stbewo
stbewo 10.10.2008 um 07:04:49 Uhr
Goto Top
Hi zusammen,

während Ihr noch schlaft, wollte ich weiter machen machen musste aber feststellen, da jibt es ja gar nichts mehr zu machen. Schade ;-(
Dann kann ich mich ja wieder hinlegen.

Gruß
Stefan
TheUntouchable
TheUntouchable 14.10.2008 um 10:07:59 Uhr
Goto Top
Hehe danke trotzdem Stefan ;)
Letztendlich habe ich jetzt noch ein wenig rumexperimentiert und die Wechseldatenträger doch mitgenommen, ebenso wie Diskettenlaufwerke. Bis jetzt funktionierts bei mir super, wäre nett wenns noch jemand testen könnte =)

@echo off

::Suchen der HDDs und Ausgabe
::------------------------------------------------------------------------------------------------------
for /f "skip=1 Tokens=1,*" %%a in ('wmic logicaldisk where "Drivetype=3" get name^, volumename') do (  
        call :displayIt1 %%a %%~b "Keine Bezeichnung")  
goto :NEXT2

:displayIt1
IF "%1"=="%SystemDrive%" (  
    ECHO                    %1 %~2 ^(Windows Laufwerk^)
) else (
    ECHO                    %1 %~2
)
Goto :eof

::Suchen von Diskettenlaufwerken und Ausgabe
::------------------------------------------------------------------------------------------------------
:NEXT2
for /f "skip=1 Tokens=1,4,5* delims=, " %%a in ('wmic logicaldisk where "Drivetype=2" get description^, name^, volumename') do (  

call :displayIt2 %%a %%b %%~c "Keine Bezeichnung")  

goto :NEXT3

:displayIt2
IF "%1"=="3" (  
	dir a: 2>nul|find "A:">nul && ECHO                    %2 %~3 ^(Diskettenlaufwerk^)  
)
)
GOTO :eof

::Suchen von Wechseldatenträgern und Ausgabe
::------------------------------------------------------------------------------------------------------
:NEXT3
for /f "skip=1 Tokens=1,2,3* delims= " %%a in ('wmic logicaldisk where "Drivetype=2" get description^, name^, volumename') do (  

call :displayIt3 %%a %%b %%~c "Keine Bezeichnung")  

goto :NEXT4

:displayIt3
IF "%1"=="Wechseldatentr„ger" (  
	ECHO                    %2 %~3 ^(Wechseldatentra„ger^)

)
)
GOTO :eof

:NEXT4
pause