99046
Goto Top

USB-Laufwerk unter WIN VISTA finden mittels verschachtelter FOR-Schleife

Hallo zusammen,
ich habe ein Backup-Script, das unter XP prima läuft.
Ich brauche es jetzt für Windows-VISTA, hier der Teil, der das USB-Laufwerk finden soll:

@echo off & setlocal enabledelayedexpansion

Set SuchLW= & Set LW= & Set Chckloibl= & Set Liste= & set VLaibl= 
Set Chckloibl=USB

for /F "skip=1" %%a in ('fsutil fsinfo drives ^| find ":\"') do set "Liste=!Liste! %%a"  
Set Liste=%liste:\=%
for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') DO set "VLaibl=%%l" & if "!VLaibl:~0,3!"=="%Chckloibl%" set LW=%%a\ 2>nul  

Set LW=%LW:~0,-1%
echo. && @echo Backuplaufwerk %LW% && echo. && pause

Ich komme nicht weiter, erhalte keine Ausgabe -
hat jemand einen Tip ?

Vielen Dank !
Rob

Content-Key: 173096

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

Printed on: April 24, 2024 at 20:04 o'clock

Member: Skyemugen
Skyemugen Sep 14, 2011 at 12:00:23 (UTC)
Goto Top
Aloha,

auch schon als Administrator ausgeführt?

greetz André
Mitglied: 99045
99045 Sep 14, 2011 at 12:28:08 (UTC)
Goto Top
Hi,

Befehle in deiner Zeile 03 trennen, jeweils eine Zeile für jeden SET-Befehl.

Zum Testen

back-to-top@echo on

benutzen!

Gruß
Member: bastla
bastla Sep 14, 2011, updated at Oct 18, 2012 at 16:48:17 (UTC)
Goto Top
Hallo Rob400!

Ob wohl der Ansatz unter Batchdatei UNTER VISTA - Abfrage einer bestimmten USB-Platte (Laufwerksbuchstabe kann varieren) helfen könnte?

Grüße
bastla
Mitglied: 99046
99046 Sep 15, 2011 at 12:51:03 (UTC)
Goto Top
Hallo,
danke für eure schnellen Antworten.
ja, ich habe als Administrator ausgeführt.

Dieser Code: (habe "chekk.dat" auf dem USB-Stick angelegt)
@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\chekk.dat") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"  
echo Next>>"%GUDL%"  
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:  
del "%GUDL%"  
if not defined LW cls & echo USB-Festplatte leider nicht erkannt! & echo. & pause & goto :eof
echo USB-Festplatte ist Laufwerk %LW%
bringt:
"USB-Festplatte leider nicht erkannt!"

Dieser Code:
::	@echo off & setlocal
@echo off 
cd c:\
@echo on & setlocal
Set Chckloibl=USB
set LW=
set Liste=
FOR /F "tokens=* delims=:\" %%a in ('"fsutil fsinfo drives"') do set "Liste=%%a"  
echo %Liste%
Set Liste=%liste:\=%
echo %Liste%
Set Liste=%liste:~11%
echo %Liste%

REM	wie bastel ich das IF NOT rein ?	##
for %%a in ("%Liste:~,2%") do for /f "tokens=6" %%l in ('vol %%a') DO set "VLaibl=%%l" & if "!VLaibl:~0,3!"=="%Chckloibl%" set LW=%%a  
REM	if not:   Set Liste=%liste:~3%
    / 2>nul

echo %VLaibl%
echo %Liste%
echo %LW%

hat folgende Ausgabe:
C:\>Set Chckloibl=USB
C:\>set LW=
C:\>set Liste=
C:\>FOR /F "tokens=* delims=:\" %a in ('"fsutil fsinfo drives"') do set "Liste=%a"  
C:\>set "Liste=Laufwerke: C:\ E:\ F:\ G:\ H:\ "  
C:\>echo Laufwerke: C:\ E:\ F:\ G:\ H:\
Laufwerke: C:\ E:\ F:\ G:\ H:\
C:\>Set Liste=Laufwerke: C: E: F: G: H:
C:\>echo Laufwerke: C: E: F: G: H:
Laufwerke: C: E: F: G: H:

C:\>Set Liste=C: E: F: G: H:
C:\>echo C: E: F: G: H:
C: E: F: G: H:
C:\>REM wie bastel ich das IF NOT rein ?        ##
C:\>for %a in ("C:") do for /F "tokens=6" %l in ('vol %a') DO set "VLaibl=%l"   & if "!VLaibl:~0,3!" == "USB" set LW=%a /  2>nul  
C:\>for /F "tokens=6" %l in ('vol "C:"') DO set "VLaibl=%l"   & if "!VLaibl:~0,3!" == "USB" set LW="C:" /  2>nul  
C:\>set "VLaibl=SYSTEM"   & if "!VLaibl:~0,3!" == "USB" set LW="C:" /  2>nul  
C:\>echo SYSTEM
SYSTEM

C:\>echo C: E: F: G: H:
C: E: F: G: H:

C:\>echo
ECHO ist eingeschaltet (ON).

Weiß jemand Rat für Zeile 15-18 ?
Danke !

Grüsse
Rob
Member: bastla
bastla Sep 15, 2011 at 13:16:55 (UTC)
Goto Top
Hallo rob400!
"USB-Festplatte leider nicht erkannt!"
ist ja auch die richtige Reaktion darauf, dass Du einen Stick verwendest ... face-wink

... bzw konkret: Es kommt auf den "DriveType"-Wert an - für einen Stick wäre das 1, für die Platte 2. Wenn beide Medienarten möglich sein sollen, ändere die Zeile 3 auf
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType^<=2 Then If D.IsReady Then If fso.FileExists(D.DriveLetter^&":\chekk.dat") Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"
Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 13:20:49 (UTC)
Goto Top
Hi,

wenn du sowieso auf dem entsprechenden Laufwerk eine Semaphor-Datei anlegst, kannst du dir den ganzen Schnickschnack sparen und zur Suche des gewünschten Laufwerks einen Einzeiler verwenden:
for %%a in (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:\chekk.dat @echo Laufwerk ist %%a && set "LW=%%a"

Gruß
Member: bastla
bastla Sep 15, 2011 at 13:25:54 (UTC)
Goto Top
... solltest aber dann besser ev vorhandenen Kartenleserslots keine Laufwerksbuchstaben zugeordnet haben ...

Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 13:53:37 (UTC)
Goto Top
ev vorhandenen Kartenleserslots keine Laufwerksbuchstaben

Hamwa nich, kriejen wa ooch nich. face-smile
Vermutlich (?) verhalten die sich aber auch nicht anders als ein CD/DVD-Laufwerk ohne eingelegtes Medium.

Man kann aber auch die Maximalliste auf die evtl. vorhanden möglichen Laufwerksbuchstaben verkürzen. face-wink

Gruß
Mitglied: 99046
99046 Sep 15, 2011 at 14:15:34 (UTC)
Goto Top
noch mal danke an euch !

@bastla, klappt jetzt. Klasse.
geht s auch ohne Semaphore-Datei ?
@echo off & setlocal
set "GUDL=%temp%\GetUSBDriveLetter.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType^<=2 Then If D.IsReady Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"  
echo Next>>"%GUDL%"  
set LW=
for /f %%i in ('cscript //nologo "%GUDL%"') do set LW=%%i:  
del "%GUDL%"  
if not defined LW cls & echo USB-Festplatte leider nicht erkannt! & echo. & pause & goto :eof
echo USB-Festplatte ist Laufwerk %LW%
bringt Fehler:
"USB-Festplatte ist Laufwerk C:"

(MIT Semaphore: "USB-Festplatte ist Laufwerk H:"
Mitglied: 99045
99045 Sep 15, 2011 at 14:25:34 (UTC)
Goto Top
Welches Laufwerk ist denn nun dein gewünschtes USB-Laufwerk und welchen Typ gibt dir
fsutil fsinfo drivetype LW:\
aus?
Mitglied: 99046
99046 Sep 15, 2011 at 14:29:48 (UTC)
Goto Top
H: ist korrekt.

C:\>fsutil fsinfo drivetype h:
h: - Austauschbares Laufwerk

C:\>vol h:
 Datenträger in Laufwerk H: ist USB_xxx
 Volumeseriennummer: xxxx-xxxx
Mitglied: 99045
99045 Sep 15, 2011 at 14:35:09 (UTC)
Goto Top
Dann kannst du
For %%a in (%LISTE%) do fsutil fsinfo drivetype %%a:\ | findstr "Austauschbar" && set LW=%%a
verwenden, In Liste definierst du vorher die bei dir max. vorhandenen Laufwerksbuchstaben (nur die, ohne : und \, aber mit Leerzeichen dazwischen).

Allerdings benötigt FSUTIL Administratorrechte bzw. eine entsprechend angepasste UAC unter Vista / Win7
Einfacher wäre es mit der Semaphor-Datei bzw. mit VBScript, die funktionieren ohne. face-wink
Mitglied: 99046
99046 Sep 15, 2011 at 14:44:59 (UTC)
Goto Top
@99045, Danke für die Info.

@bastla, hast Du noch n Tip, wie die Laufwerkerkennung mit Deinem obigen Script,
aber ohne Semaphore-Datei
(d.h. für beliebige(n) USB Stick / Platte) geht ?

Danke, Rob
Mitglied: 99045
99045 Sep 15, 2011 at 14:51:35 (UTC)
Goto Top
Ich heiße zwar nicht bastla, kann dir die Info aber auch vermitteln:

  • 0="Unknown"
  • 1="Removable"
  • 2="Fixed"
  • 3="Network"
  • 4= "CD-ROM"
  • 5="RAM Disk"

Du müsstest also <=2 in =1 ändern..
Mitglied: 99046
99046 Sep 15, 2011 at 15:03:31 (UTC)
Goto Top
@99045, Klasse.

Danke für die Unterstützung !

Gruss,
Rob
Member: bastla
bastla Sep 15, 2011 at 15:43:51 (UTC)
Goto Top
@99045
Danke für's Dolmetschen von
... für einen Stick wäre das 1, für die Platte 2
face-wink

Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 15:50:19 (UTC)
Goto Top
@bastla
Bitte sehr, dafür nehme ich nichts. *gg

Das mit dem Stick=1 stimmt aber nicht immer. Wenn der Stick als MBR-Device formatiert ist, hat er die 2 und wird als ganz normale Festplatte erkannt.

Gruß
Kaputtnick
Member: bastla
bastla Sep 15, 2011 at 15:54:11 (UTC)
Goto Top
@99045
hat er die 2 und wird als ganz normale Festplatte erkannt.
... was aber nicht zur "Nicht-Erkennung" durch die erste Version geführt hätte (abgesehen davon war das ja auch ein Grund dafür, die Variante "<=2" anzubieten) ...

Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 15:56:57 (UTC)
Goto Top
Aber <=2 beinhaltet auch "Unknown" bzw. in fsutil "Stammverzeichnis nicht vorhanden" und führt dann evtl. auch zum Fehler (wenn's nicht ready sein sollte) . face-smile
Member: bastla
bastla Sep 15, 2011 at 16:02:08 (UTC)
Goto Top
Ich hatte vorhin schon zur Einschränkung "... aber natürlich wäre noch der Fall "0" auszuschließen" angesetzt, wollte Dir aber die Freude nicht nehmen ... face-wink

Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 16:05:15 (UTC)
Goto Top
Danke, nett von dir. face-smile Allerdings ging es dem TO ja um die Version ohne Semaphor und mit seiner Version von 16:14 landet er eben bei C:.

Auf der anderen Seite müsstest du mich doch soweit kennen, dass ich nur sehr selten fertige Lösungen, sondern nur Denkansätze liefere. Schließlich sollten unsere TOs auch mal selbst etwas gefordert werden, was ja meistens auch klappt.
Member: bastla
bastla Sep 15, 2011 at 16:13:03 (UTC)
Goto Top
Allerdings ging es dem TO ja um die Version ohne Semaphor
aber auch um
für beliebige(n) USB Stick / Platte
- und das wird sich über "DriveType" nicht lösen lassen ...

Grüße
bastla
Mitglied: 99045
99045 Sep 15, 2011 at 16:18:42 (UTC)
Goto Top
und das wird sich über "DriveType" nicht lösen lassen
Das ist richtig, hat aber auch niemand behauptet. Deshalb ja entweder ein(en) Semaphor nutzen oder eben Volume-Seriennummer, Label oder sonstige spezifische Merkmale zusätzlich verwenden, dann ist man (fast) immer auf der sicheren Seite.
Member: bastla
bastla Sep 15, 2011 at 16:24:40 (UTC)
Goto Top
So könnten wir dann verbleiben ... face-smile

... besonders, da ganz weit oben etwas in der Art erste 3 Stellen des Labels = "USB" zu entnehmen ist - dann sollte sogar etwas (Ungetestetes) wie in etwa
echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=1 Or D.DriveType=2 Then If D.IsReady Then If UCase(Left(D.VolumeName,3))="USB" Then WScript.Echo D.DriveLetter:Exit For>"%GUDL%"
zum Ziel führen.

Grüße
bastla

[Edit[ "VolumeName" richtig gestellt [/Edit]
Mitglied: 99046
99046 Sep 15, 2011 at 19:23:41 (UTC)
Goto Top
Hallo noch mal,

... es führt zum Ziel, prima Verbesserung ... exakt nach Wunsch ! face-smile

Ein weiteres Mal großes DANKE an euch beide !

Gruss,
Rob