bossjo
Goto Top

Per Batch freien Laufwerksbuchstaben ermitteln

Es soll per Batch eine verschlüsselte Datei als Laufwerk eingebunden werden, von dem ich den Laufwerksbuchstaben für die Weiterverarbeitung benötige. Diese Batch soll auf verschiedensten Rechnern zum Einsatz kommen. Deshalb kann ich den Laufwerksbuchstaben nicht vorher festlegen.

Leider brachte googeln keine brauchbaren Tips. Hier im Forum habe ich schon viele gute Tips zu Batch-Scripts bekommen. Würde mich freuen, wenn jemand zu meinem Problem auch einen guten Tip hat.
Ich kann bisher alle vergebenen Laufwerksbuchstaben per For-Schleife abfragen:

:codeAnfang
for %%i in ( e f g h i j k l m n o p q r s t u v w x y z ) do ( dir %%i: >>Dir.txt )
for /F "tokens=3" %%i in ('type "Dir.txt" ^|findstr "e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w:"') do ( echo %%i >>LW.txt)
:codeEnde

Damit bin ich nun in der Lage die Laufwerke nach dem Vorhandensein einer bestimmten Datei zu überprüfen.

Will ich nun aber wissen, welche Laufwerksbuchstaben noch frei sind, kann ich nicht einfach eines der übrigen Laufwerke nehmen, da CD/DVD-Laufwerke und Kartenlesegeräte mit dem Dir-Befehl (wenn kein Datenträger eingelegt ist) nicht auf stdout ausgegeben werden. Ich kann nur den stderr mit 2>1& auf stdout umleiten und bekomme jetzt auch die Fehlermeldungen für die Wechseldatenträger-Laufwerke. Der Haken ist, dass ich leider aus der Ausgabe nicht ermitteln kann, welches Laufwerk nun den Fehler "Laufwerk nicht bereit" (für CD- und Karten-LW) zurück gibt.
Will ich mit "if not exist x:/NUL" die Laufwerke nacheinander "abgrasen", bekomme ich beim ersten CD-LW oder Kartenleser eine häßliche Windows-Meldung im separaten Fenster: "Laufwerk nicht bereit" und das Script stopt, bis eine Schaltfläche gedrückt wird. Das muss ich vermeiden.

Ich wäre sehr dankbar für Eure Hilfe. Leider sitzt mir ein bischen die Zeit im Nacken.

Content-ID: 58915

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

Biber
Biber 14.05.2007, aktualisiert am 18.10.2012 um 18:31:55 Uhr
Goto Top
Moin bossjo,

willkommen im Forum.
1.) WTF is Google? *gg
2.) ich würde den Umweg über einen VBS-Schnipsel wählen, wie in diesen beiden Beiträgen beschrieben:
Installationspfad einer unbekannten Anwendung suchen auf unbekanntem PC
-oder -
Festplattengröße auslesen

In beiden Beitgägen wird skizziert, wie Du über FileSystemInfo.Drives.DriveType ein CD-Laufwerk von einem Netz- oder lokalen Laufwerk unterscheiden kannst und wie Du mit ...IsReady feststellen kannst, ob das Laufwerk bereit ist.

Das von Dir beschriebene Verhalten mit der hässlichen Popup-GUI-Fehlermeldung kommt NICHT immer bzw. nicht auf allen Rechnern.
Bei mir funktioniert auch ein
>for %i in (b g h i j k l m n o p) do @if exist %i:/nul echo %i
l

[Nur L: wird ausgegeben, G:, H: I: und J: sind CD-Laufwerke; G: und H: sogar mit offenem Schacht]

Diese GUI-Fehlermeldung habe ich aber auch schon gesehen - muss an irgendeiner Registry-Einstellung liegen, aber genauer weiß ich es nicht.

Gruss
Biber
bossjo
bossjo 14.05.2007 um 09:32:29 Uhr
Goto Top
Guten Morgen biber,
erstmal vielen Dank und fettes Lob für die schnelle Antwort.
Leider kenn ich mich mit VBS überhaupt nicht aus und kann dem ganzen auch nicht folgen.
Ich hab nochmal einen Gedankenansatz. Ich würde gerne die stderr-Ausgabe von Dir-Befehl in der For-Schleife weiter verwenden. Leider klappt es mit der Umleitung von stderr nicht. Ich bekomme immer die Meldung: "|" syntaktisch an dieser Stelle falsch

for %%i in ( e f g h i j k l m n o p q r s t u v w x y z ) do (
for %%j in ('Dir %%i:\ 2>1& ^|findstr /C:"Das System kann den angegebenen Pfad nicht finden."') do ( set LW=%%j ))

Wenn ich

for %%i in ( e f g h i j k l m n o p q r s t u v w x y z ) do (Dir %%i:\ 2>%%i.txt)

nehme, funktioniert das, kann aber die Ausgabe nicht über die pipe als Variable setzten.
paulepank
paulepank 14.05.2007 um 09:37:24 Uhr
Goto Top
Hallo,

das Kommando SUBST kann hier weiterhelfen.
In einer Schleife kann man mit SUBST versuchen nacheiander einen auf allen Rechnern existierendes Verzeichnis (z.B. %SystemRoot%) einzubinden.
Sofern %ERRORLEVEL% gleich 0 hat man es gefunden , merkt sich den Laufwerksbuchstaben und hebt die Einbindung wieder auf.

Ich habe keinen Code formuliert, da du offensichtlich selbst dazu in der Lage bist.

cu paulepank
Biber
Biber 14.05.2007 um 09:55:28 Uhr
Goto Top
Moin bossjo,

Antwort auf Deine Frage: Du musst noch ein paar Steuerzeichen/Zeichen mit spezieller Bedeutung maskieren. Und zwar:
...
for /f %%i in ('dir %%i:\<b> ^2^>^&^1 </b>^|FindStr /C:"Das System kann"') do ...  

[Frag nicht, nimm es einfach hin...*gg]

Desweiteren solltest Du abwägen, ob Du das erste gefundene Laufwerk gemäß Kriterien haben willst oder das letzte.

Wenn das Letzte: Dann hast Du alles richtig.
Wenn das Erste: Dann solltest Du schreiben: .....Do if not defined LW set "LW=%%j )

Gruss
Biber
bossjo
bossjo 14.05.2007 um 17:09:04 Uhr
Goto Top
Juppii Juppii Heeeeeee, Das is es. Es funktioniert face-smile
Danke für die superschnelle und kompotente Hilfe. Auch der Hinweis mit IF DEFINED war spitze und hat mir die nächste Frage vorweg genommen. Hätte ich mich mal vorher hier im Forum gemeldet, dann wären mir 2 Tage Tüftelei erspart geblieben. Nun ist mein Script fertig. Vielleicht kann ja die Nachwelt was damit anfangen. Die Anwendung ist simple. Ein User erhält einen Stick mit verschlüsselten Daten. Diese sollen automatisch entschlüsselt und bearbeitet werden können.
Der Ablauf im Script soll folgendermaßen passieren:
Der Stick mit einer verschlüsselten Datei wird an den USB-Port gesteckt. Danach wird das Script gestartet. Ersteinmal wird geprüft, welchen Laufwerksbuchstaben der Stick bekommen hat und nach einem bestimmten Dateinamen gesucht. Dann wird geprüft, welcher Laufwerksbuchstabe als nächstes frei ist und anschließend die verschlüsselte Datei mit TrueCrypt als Laufwerk eingehängt. Die Anwendung, die die verschlüsselten Daten verwendet wird gestartet mit Angabe des Datenpfades. Nach Ende der Anwendung wird automatisch das gemountete Laufwerk wieder ausgehängt.

Hier nun das Script in abgespeckter Version:
::Scriptanfang
@echo off
@rem **** Stick suchen und Parameter %Stick% setzten
:FINDSTICK
set LWBSTB=e:\ f:\ g:\ h:\ i:\ j:\ k:\ l:\ m:\ n:\ o:\ p:\ q:\ r:\ s:\ t:\ u:\ v:\ w:\

set Stick=
@rem **** existierene Laufwerke ermitteln, Laufwerksbuchstaben filtern und nach Datei "Geheim" suchen  
for %%i in ( %LWBSTB% ) do (
	for /F "tokens=3" %%j in ( '@dir %%i ^2^>^&^1 ^|findstr "%LWBSTB%"') do (  
		for %%k in (%%j) do (
			if defined Stick (goto :FINDLAUFWERK) else (if exist "%%k"Geheim (Set Stick=%%k) )))  
)
if %Stick%!==! goto STICKMESSAGE

@rem **** Mount-Laufwerk festlegen
@rem **** ersten freien Laufwerksbuchstaben finden und CD/DVD bzw. Kartenlesegeräte ausschließen
:FINDLAUFWERK
set LWM=

for %%i in ( %LWBSTB% ) do (
	for /f %%j in ( '@Dir %%i ^2^>^&^1 ^|findstr /X /C:"Das System kann den angegebenen Pfad nicht finden."' ) do (  
		 if defined LWM (goto :FOUND) else (set LWM=%%i) )
)
if %LWM%!==! goto NOFREELW

:Found
cls
echo.
echo Stick gefunden als Laufwerk %Stick%
echo erstes freies Laufwerk = %LWM%
pause
EOF

@rem ####### verschlüsselte Datei als Laufwerk einbinden ###########
:MOUNT
cls
echo.
echo Bitte warten, Verschlsseltes Laufwerk wird eingebunden ....
echo.
TrueCrypt.exe /q /a /m rm /v /k key "%Stick%\Geheim" /l%LWM%  

@rem **** Anwendung Starten, die die verschlüsselten Dateien verwendet
:STARTPRG
start Anwendung.exe /%LWM%(PfadZuDenDaten)

@rem **** Mount-Laufwerk wieder trennen
:UMOUNT
TrueCrypt.exe /q /d %LWM% /f
goto EXIT


@rem ############### Fehlermeldungen ###################
:NOFREELW
@echo Kein Laufwerksbuchstabe mehr frei
pause
goto EXIT

:STICKMESSAGE
@echo Kein Stick mit verschluesselter Datei gefunden
pause
goto EXIT

:EXIT

::Scriptende
Wie gesagt, ist es ist nur eine abgespeckte Version. Im Original fange ich noch alle erdenklichen Fehler ab und gebe z.B. mit msgbox Informationen oder Meldungen aus und Auswahl- und Eingabemöglichkeiten für den Anwender. Außerdem werden Verzeichnisse aufgelistet und dem User zur Auswahl angezeigt, Zip-Archive erstellt und entpackt, überprüft ob bestimmte Anwendungen laufen und wenn notwendig beendet oder gestartet usw.

Vielen Dank an Biber und paulepank ( Der Hinweis mit SUBST bringt wieder neue Ideen für meine nächsten Batch-Scripts.)