sascha46
Goto Top

Abfrage des Laufwerksnamen per Batch

Hallo zusammen

Ich habe ein Skript was mir alle Laufwerksbuchstaben durchläuft und mir von den Laufwerken den Namen ausgibt.
Nun möchte ich, wenn das Laufwerk einen bestimmten Namen hat einen Befehl ausführen.
Leider bekomme ich bei der "if !LWA! == %LWA01%" keine Übereinstimmung, obwohl es das Laufwerk mit dem
Namen "Windows_os" gibt. Kann mir einer sagen warum die IF abfrage nicht greift?


@echo off
SETLOCAL EnableDelayedExpansion
cls
set LWA01=Windows_os

 FOR %%i IN (C D E F G H) DO (
for /f "tokens=2 delims==" %%A in ('wmic volume where DriveLetter^="%%i:" get Label /value') do (  
set LWA=%%A

echo !LWA!

if !LWA! == %LWA01% (

echo hallo sascha

)
)
)
pause

Content-ID: 372713

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

Ausgedruckt am: 26.11.2024 um 01:11 Uhr

SlainteMhath
SlainteMhath 02.05.2018 um 09:11:27 Uhr
Goto Top
Moin,

Zeile 12: du brauchst je ein ! vor und nach dem %LWA01%

lg,
Slainte
Pjordorf
Pjordorf 02.05.2018 aktualisiert um 09:14:18 Uhr
Goto Top
Hallo,

Zitat von @sascha46:
@echo off
Da würde ich erstmal ein REM davorschreiben oder ein @echo On hintuen.

echo !LWA!
Und was steht dann dort? Windows_os oder sind dort die Buchstaben/Zahlen/Zeichen (und dazu zählen auch Leerzeichen) anders?

Gruß,
Peter
sascha46
sascha46 02.05.2018 um 10:01:58 Uhr
Goto Top
@SlainteMhath
Die Variable %LWA01% ist doch eine konstante Variable, die wird gleich zu Anfang gesetzt und wird
nicht verändert.
Nur die Variable !LWA! ist eine Variable die sich zur Laufzeit aktualisieren muss.

@Pjordorf
In der Variable !LWA! stehen immer die Laufwerksnamen, das funktioniert also die Variable !LWA!
wird also zur Laufzeit aktualisiert. Aber die IF abfrage funktioniert nicht, ich finde den Fehler leider nicht.


Gruss Sascha
Pjordorf
Pjordorf 02.05.2018 um 10:07:31 Uhr
Goto Top
Hallo,

Zitat von @sascha46:
In der Variable !LWA! stehen immer die Laufwerksnamen, das funktioniert also die Variable !LWA!
Was genau steht in der Variable drin? Poste das mal hier (von einer Kommandzeile aus).

Aber die IF abfrage funktioniert nicht, ich finde den Fehler leider nicht.
Dann passen deine beiden Variablen nicht zusammen.

Gruß,
Peter
Zendara
Zendara 02.05.2018 um 10:18:45 Uhr
Goto Top
Hallo Sascha46,

ich benutze eine ein ähnliches Skript. Vielleicht hilft dir das weiter

@echo off & setlocal enabledelayedexpansion

set "find_Drive=NA"  

for %%b in (c d e f g h i j k l m n o p q r s t) do (
	for /f "tokens=6 delims= " %%a in ('vol %%b: 2^>^&0') do (  
		if exist %%b:\* (
			if /I "%%a"  == "Windows_os" (  
				set "find_Drive=%%b"  
				)
			)
		)
	)

if not %find_Drive%==NA ( echo Laufwerk gefunden LW: %find_Drive%:\ ) else ( echo Laufwerk nicht gefunden. )
pause

Lg
Zendara
sascha46
sascha46 02.05.2018 um 10:26:32 Uhr
Goto Top
Ich schicke heute Abend mal ein Ausdruck was in der Konsole steht.
sascha46
sascha46 02.05.2018 um 12:18:43 Uhr
Goto Top
Hallo

Hier der Batch mit Rem @echo Off

Ich habe 2 Laufwerke,
Laufwerk C:\ = System
Laufwerk D:\ = Daten
Die werden auch richtig durch das Echo wiedergegeben.

D:\Users\hocsas\Desktop>rem @echo off

D:\Users\hocsas\Desktop>SETLOCAL EnableDelayedExpansion

D:\Users\hocsas\Desktop>set LWA01=System

D:\Users\hocsas\Desktop>FOR %i IN (C D) DO (for /F "tokens=2 delims==" %A in ('wmic volume where DriveLetter="%i:" get Label /value') do (  
set LWA=%A
 echo !LWA!
 if !LWA! == System (echo hallo sascha )
) )

D:\Users\hocsas\Desktop>(for /F "tokens=2 delims==" %A in ('wmic volume where DriveLetter="C:" get Label /value') do (  
set LWA=%A
 echo !LWA!
 if !LWA! == System (echo hallo sascha )
) )

D:\Users\hocsas\Desktop>(
  t LWA=System
 echo !LWA!
 if !LWA! == System (echo hallo sascha )
)
System

D:\Users\hocsas\Desktop>(for /F "tokens=2 delims==" %A in ('wmic volume where DriveLetter="D:" get Label /value') do (  
set LWA=%A
 echo !LWA!
 if !LWA! == System (echo hallo sascha )
) )

D:\Users\hocsas\Desktop>(
  t LWA=Daten
 echo !LWA!
 if !LWA! == System (echo hallo sascha )
)
Daten

D:\Users\hocsas\Desktop>pause
Drücken Sie eine beliebige Taste . . .
rubberman
Lösung rubberman 02.05.2018 um 14:24:10 Uhr
Goto Top
Zwei Dinge:
1. WMIC hat einen Bug, der existiert solange es WMIC gibt. Am Zeilenende bleibt ein Carriage Return Zeichen stehen, das du mit einer zusätzlichen Schleife eliminieren kannst.
2. Vergleiche die Werte in Anführungszeichen eingefasst und lasse die Leerzeichen um == weg.

ungetestet
@echo off
SETLOCAL EnableDelayedExpansion
cls
set "LWA01=System"  

FOR %%i IN (C D E F G H) DO (
  for /f "tokens=2 delims==" %%A in ('wmic volume where DriveLetter^="%%i:" get Label /value') do for /f "delims=" %%B in ("%%A") do (  
    set "LWA=%%B"  
    echo !LWA!
    if "!LWA!"=="%LWA01%" (  
      echo hallo sascha
    )
  )
)
pause
Natürlich brauchst du die Variable LWA eigentlich nicht und kanns gleich mit %%B arbeiten.

Steffen
sascha46
sascha46 02.05.2018 um 18:53:46 Uhr
Goto Top
Es funktioniert hervorragend vielen Herzlichen Dank an alle.

@rubberman
Das muss man auch erst mal wissen face-smile, es klappt wirklich Super.
Wieso werden die Leerzeichen bei == entfernt?
und warum sind die Variablen auch zwischen Anführungszeichen? Ist das einfach
so oder hat das einen speziellen Grund?


Gruss Sascha
rubberman
rubberman 02.05.2018 um 19:28:15 Uhr
Goto Top
Wieso werden die Leerzeichen bei == entfernt?
Damit sie nicht mit verglichen werden. Batch ist da etwas eigen im Vergleich zu anderen Sprachen. Bei Zuweisungen ist das genauso. Ein
set "a = b"
würde eine Variable %a % (beachte das Leerzeichen) erzeugen. Auch der Wert b hätte dann ein vorangestelltes Leerzeichen.

und warum sind die Variablen auch zwischen Anführungszeichen?
Das ist eher Best Practice. Leere Strings, Leerzeichen oder Sonderzeichen (z.B. &<>|) erzeugen einen Syntaxfehler, wenn die zu vergleichenden Strings nicht in Anführungszeichen gesetzt sind. Bzgl. Sonderzeichen gibt es auch hier wieder die Analogie zu Zuweisungen (falls du dich über die Anführungszeichen im obigen Beispiel gewundert haben solltest).

Steffen
sascha46
sascha46 02.05.2018 um 21:10:34 Uhr
Goto Top
Herzlichen Dank

Wie heisst es so schön, man wird alt wie eine Kuh und lernt immer noch dazu face-smile

Vielen Dank

Gruss Sascha
77559
77559 13.05.2018 um 00:53:32 Uhr
Goto Top
Eigentlich besteht keine Notwendigkeit die Laufwerksbuchstaben vorzugben,

Wmic kennt die doch.
@Echo off
For /f "tokens=1,2" %%A in (  
  'wmic logicaldisk get DeviceID^,VolumeName'  
) do For %%C in (%%B) do If /i "%%C"=="Windows_os" echo Hallo sascha (%%A=%%C)  

Gruß
LotPings