Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch freien Laufwerksbuchstaben ermitteln

Frage Entwicklung Batch & Shell

Mitglied: bossjo

bossjo (Level 1) - Jetzt verbinden

13.05.2007, aktualisiert 18.10.2012, 20615 Aufrufe, 5 Kommentare

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.
Mitglied: Biber
14.05.2007, aktualisiert 18.10.2012
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
01.
>for %i in (b g h i j k l m n o p) do @if exist %i:/nul echo %i 
02.
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
Bitte warten ..
Mitglied: bossjo
14.05.2007 um 09:32 Uhr
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.
Bitte warten ..
Mitglied: paulepank
14.05.2007 um 09:37 Uhr
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
Bitte warten ..
Mitglied: Biber
14.05.2007 um 09:55 Uhr
Moin bossjo,

Antwort auf Deine Frage: Du musst noch ein paar Steuerzeichen/Zeichen mit spezieller Bedeutung maskieren. Und zwar:
01.
... 
02.
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
Bitte warten ..
Mitglied: bossjo
14.05.2007 um 17:09 Uhr
Juppii Juppii Heeeeeee, Das is es. Es funktioniert
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:
01.
::Scriptanfang 
02.
@echo off 
03.
@rem **** Stick suchen und Parameter %Stick% setzten 
04.
:FINDSTICK 
05.
set LWBSTB=e:\ f:\ g:\ h:\ i:\ j:\ k:\ l:\ m:\ n:\ o:\ p:\ q:\ r:\ s:\ t:\ u:\ v:\ w:\ 
06.
 
07.
set Stick= 
08.
@rem **** existierene Laufwerke ermitteln, Laufwerksbuchstaben filtern und nach Datei "Geheim" suchen 
09.
for %%i in ( %LWBSTB% ) do ( 
10.
	for /F "tokens=3" %%j in ( '@dir %%i ^2^>^&^1 ^|findstr "%LWBSTB%"') do ( 
11.
		for %%k in (%%j) do ( 
12.
			if defined Stick (goto :FINDLAUFWERK) else (if exist "%%k"Geheim (Set Stick=%%k) ))) 
13.
14.
if %Stick%!==! goto STICKMESSAGE 
15.
 
16.
@rem **** Mount-Laufwerk festlegen 
17.
@rem **** ersten freien Laufwerksbuchstaben finden und CD/DVD bzw. Kartenlesegeräte ausschließen 
18.
:FINDLAUFWERK 
19.
set LWM= 
20.
 
21.
for %%i in ( %LWBSTB% ) do ( 
22.
	for /f %%j in ( '@Dir %%i ^2^>^&^1 ^|findstr /X /C:"Das System kann den angegebenen Pfad nicht finden."' ) do ( 
23.
		 if defined LWM (goto :FOUND) else (set LWM=%%i) ) 
24.
25.
if %LWM%!==! goto NOFREELW 
26.
 
27.
:Found 
28.
cls 
29.
echo. 
30.
echo Stick gefunden als Laufwerk %Stick% 
31.
echo erstes freies Laufwerk = %LWM% 
32.
pause 
33.
EOF 
34.
 
35.
@rem ####### verschlüsselte Datei als Laufwerk einbinden ########### 
36.
:MOUNT 
37.
cls 
38.
echo. 
39.
echo Bitte warten, Verschlsseltes Laufwerk wird eingebunden .... 
40.
echo. 
41.
TrueCrypt.exe /q /a /m rm /v /k key "%Stick%\Geheim" /l%LWM% 
42.
 
43.
@rem **** Anwendung Starten, die die verschlüsselten Dateien verwendet 
44.
:STARTPRG 
45.
start Anwendung.exe /%LWM%(PfadZuDenDaten) 
46.
 
47.
@rem **** Mount-Laufwerk wieder trennen 
48.
:UMOUNT 
49.
TrueCrypt.exe /q /d %LWM% /f 
50.
goto EXIT 
51.
 
52.
 
53.
@rem ############### Fehlermeldungen ################### 
54.
:NOFREELW 
55.
@echo Kein Laufwerksbuchstabe mehr frei 
56.
pause 
57.
goto EXIT 
58.
 
59.
:STICKMESSAGE 
60.
@echo Kein Stick mit verschluesselter Datei gefunden 
61.
pause 
62.
goto EXIT 
63.
 
64.
:EXIT 
65.
 
66.
::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.)
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch oder PS um Datenvolumen zu ermitteln (13)

Frage von rudeboy zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...