Freien Laufwerksbuchstabe ermittlen und vergeben
Schönen guten Mittag =)
ich habe ein Problem, bzw. eine Frage:
Ich möchte eine batch Datei erstellen, die mir einen FREIEN Laufwerksbuchstaben ermittelt!
Es sollten aber auch wirklich alle vorhandenen Buchstaben ersteinmal kontrolliert werden - Auch die vom CD-ROM Laufwerk, Card Reader usw.
Brauchen tue ich das für folgendes.
Ich möchte auf Knopfdruck der Bat Datei eine Verbindung zu meinen Home-Server herstellen.
Da die Batch dann aber nicht nur auf meinen Rechner läuft, muss ich natürlich ersteinmal schauen welche Laufwerksbuchstaben noch frei sind...
net use L: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
Explorer "L:\"
Der Laufwerksbuchstabe L (nur ein Beispiel) soll automatisch generiert werden, oder eben in einen anderen FREIEN Laufwerksbuchstabe!
Ähnliche Themen habe ich schon via Google gefunden - Allerdings für mich seeehr spanisch
Man beachte, das ich mich erst seit gestern Abend mit Batch Dateien beschäftige, sprich bitte nicht nur einfach einen Link posten ;)
Wäre cool, wenn mir einer helfen könnte,
Matthias
ich habe ein Problem, bzw. eine Frage:
Ich möchte eine batch Datei erstellen, die mir einen FREIEN Laufwerksbuchstaben ermittelt!
Es sollten aber auch wirklich alle vorhandenen Buchstaben ersteinmal kontrolliert werden - Auch die vom CD-ROM Laufwerk, Card Reader usw.
Brauchen tue ich das für folgendes.
Ich möchte auf Knopfdruck der Bat Datei eine Verbindung zu meinen Home-Server herstellen.
Da die Batch dann aber nicht nur auf meinen Rechner läuft, muss ich natürlich ersteinmal schauen welche Laufwerksbuchstaben noch frei sind...
net use L: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
Explorer "L:\"
Der Laufwerksbuchstabe L (nur ein Beispiel) soll automatisch generiert werden, oder eben in einen anderen FREIEN Laufwerksbuchstabe!
Ähnliche Themen habe ich schon via Google gefunden - Allerdings für mich seeehr spanisch
Man beachte, das ich mich erst seit gestern Abend mit Batch Dateien beschäftige, sprich bitte nicht nur einfach einen Link posten ;)
Wäre cool, wenn mir einer helfen könnte,
Matthias
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 73254
Url: https://administrator.de/forum/freien-laufwerksbuchstabe-ermittlen-und-vergeben-73254.html
Ausgedruckt am: 18.04.2025 um 02:04 Uhr
26 Kommentare
Neuester Kommentar
for %%L in (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 not exist %%L:\NUL set LW=%%L
net use %LW%: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
Explorer "%LW%:\"
Es werden alle Laufwerksbuchstaben von d bis z duchsuht ob sie "erreicht werden können". wenn einer nicht erreichbar ist, wird der Variabeln %LW% dieser Laufwerksbuchstabe zugewiesen.net use %LW%: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
Explorer "%LW%:\"
miniversum
Hallo werner500!
Etwas sicherer (etwa im Hinblick auf Card-Reader) und ohne die von Dir beschriebene Fehlermeldung zu verursachen könntest Du es so versuchen:
Hier wird (temporäres) VBScript zum Auslesen der Laufwerke verwendet und (beginnend mit D = ASCII 68) ein freier Buchstabe gesucht.
Grüße
bastla
P.S.: Vielleicht möchtest Du die Daten für User und Passwort in Deinem obigen Posting wieder etwas anonymer gestalten ...
[Edit] Überzähligen ":" entfernt [/Edit]
Etwas sicherer (etwa im Hinblick auf Card-Reader) und ohne die von Dir beschriebene Fehlermeldung zu verursachen könntest Du es so versuchen:
@echo off & setlocal
set "GFDL=%temp%\GetFreeDriveLetter.vbs"
echo For Each D In CreateObject("Scripting.FileSystemObject").Drives:sL=sL^&D.DriveLetter:Next>"%GFDL%"
echo For i=68 To 90:If InStr(UCase(sL),Chr(i))=0 Then WScript.Echo Chr(i):WScript.Quit>>"%GFDL%"
echo Next>>"%GFDL%"
set LW=
for /f %%i in ('cscript //nologo "%GFDL%"') do set LW=%%i
del "%GFDL%"
if not defined LW echo Kein freier Laufwerksbuchstabe gefunden! & pause & goto :eof
net use %LW%: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
Explorer "%LW%:\"
Grüße
bastla
P.S.: Vielleicht möchtest Du die Daten für User und Passwort in Deinem obigen Posting wieder etwas anonymer gestalten ...
[Edit] Überzähligen ":" entfernt [/Edit]
Hallo werner500!
Das war leider hinsichtlich des ":" doppelt gemoppelt - wenn Du ihn in dieser Zeile
am Ende weg lässt (mach ich auch gleich oben), sollte das Ganze klappen.
Grüße
bastla
P.S.: War natürlich mein Fehler, da nur bis zur Ermittlung des Buchstabens getestet ...
Das war leider hinsichtlich des ":" doppelt gemoppelt - wenn Du ihn in dieser Zeile
for /f %%i in ('cscript //nologo "%GFDL%"') do set LW=%%i:
Grüße
bastla
P.S.: War natürlich mein Fehler, da nur bis zur Ermittlung des Buchstabens getestet ...
Hallo werner500!
Das VBScript ermittelt nur den Laufwerksbuchstaben, der Rest ist weiterhin Batch - insofern kannst Du also Deinen Server-Check per "ping" weiterhin verwenden (einfach vor der "net use"-Zeile einbauen).
Ein Popup lässt sich ebenfalls per VBS realisieren:
Zu übergeben sind Meldungstext, Dauer und Meldungstitel (in dieser Reihenfolge). Wenn Du im Code das ",vbInformation" weg lässt, wird kein Info-Symbol und kein Sound ausgegeben.
Es gibt eine "sleep.exe" in den "Windows Server 2003 Resource Kit Tools". Du kannst zum Pausieren aber auch einen "ping" verwenden:
Grüße
bastla
Das VBScript ermittelt nur den Laufwerksbuchstaben, der Rest ist weiterhin Batch - insofern kannst Du also Deinen Server-Check per "ping" weiterhin verwenden (einfach vor der "net use"-Zeile einbauen).
Ein Popup lässt sich ebenfalls per VBS realisieren:
@echo on & setlocal
set "Popup=%temp%\Popup.vbs"
echo R=WScript.CreateObject("WScript.Shell").Popup(WScript.Arguments(0),WScript.Arguments(1),WScript.Arguments(2),vbInformation)>"%Popup%"
wscript //nologo "%Popup%" "Dieser Text verschwindet nach 5 Sekunden!" 5 "Nur ein Test ..."
del "%Popup%"
Es gibt eine "sleep.exe" in den "Windows Server 2003 Resource Kit Tools". Du kannst zum Pausieren aber auch einen "ping" verwenden:
ping -n 5 127.0.0.1 >nul
Grüße
bastla
Ich hab bis jetzt keins gefunden. Bei mir bringt es auch immer diese beschissene Meldung. Irgendwo gibt es noch ein Tool, dass die Batches in COM-Files umwandelt. Dieses ist zwar gratis, aber es stammt aus DOS-Zeiten und kann komplexe Batchfiles wie deins nicht mehr richtig kompilieren.
Ich habe mir dann schweren Herzens die Vollversion eines solchen Tools zugelegt.
PS: VBScripts lassen sich verschlüsseln und in sogenannte VBE-Dateien verwandeln. (VBE=Visual Basic Encrypted). Ich habs noch nie gebraucht, ein Arbeitskollege hat es mal verwendet. Ich weiss nicht mehr, ob sich das per Visual Basic Editor bewerkstelligen lässt oder ob du noch ein weiteres Tool brauchst
Ich habe mir dann schweren Herzens die Vollversion eines solchen Tools zugelegt.
PS: VBScripts lassen sich verschlüsseln und in sogenannte VBE-Dateien verwandeln. (VBE=Visual Basic Encrypted). Ich habs noch nie gebraucht, ein Arbeitskollege hat es mal verwendet. Ich weiss nicht mehr, ob sich das per Visual Basic Editor bewerkstelligen lässt oder ob du noch ein weiteres Tool brauchst
Hallo werner500!
Ansonsten geht auch einfach
Grüße
bastla
Ich kann die Datei anschauen und so unter anderen das Passwort einsehen.
Das lässt sich vermeiden, wenn Du dasPasswort jeweils eingibst. Bei Verwendung auf einem XP-System kannst Du die Eingabe auch "unsichtbar" durchführen, wie im folgenden Beispiel (geklaut hier) gezeigt:@echo off & setlocal
set "PwIn=%temp%\PasswordInput.vbs"
echo WScript.Echo CreateObject("ScriptPW.Password").GetPassword()>"%PwIn%"
echo Bitte das Passwort eingeben:
for /f "delims=" %%i in ('cscript //nologo "%PwIn%"') do set "PW=%%i"
del "%PwIn%"
echo Eingegebenes Passwort: %PW%
Ansonsten geht auch einfach
set /p "PW=Bitte Passwort eingeben: "
echo Eingegebenes Passwort: %PW%
Grüße
bastla
@TuXHunt3R
Anyway: Zu finden ist der "Script Encoder" hier.
Grüße
bastla
VBScripts lassen sich verschlüsseln und in sogenannte VBE-Dateien verwandeln.
... und auch ganz einfach wieder entschlüsseln, da nicht passwort-geschützt. Aus der Hand geben würde ich daher so ein Script nicht.Anyway: Zu finden ist der "Script Encoder" hier.
Grüße
bastla
Hallo werner500!
Du könntest nach dem Ermitteln des Laufwerksbuchstabens diesen in eine Temp-Datei schreiben und am Beginn der Batchdatei das Vorhandensein dieser Datei überprüfen - wenn vorhanden, Buchstaben auslesen, damit Netzlaufwerk trennen und Temp-Datei löschen; wenn nicht vorhanden, weiter wie bisher.
Risiko dabei: Wenn bei der letzten Verbindung keine Trennung erfolgte, steht der "alte" Laufwerksbuchstabe weiterhin in der Temp-Datei; sollte inzwischen ein anderes Laufwerk diesen Buchstaben erhalten haben, würde beim nächsten Aufruf der Batchdatei versucht, dieses Laufwerk zu trennen ...
Grüße
bastla
Du könntest nach dem Ermitteln des Laufwerksbuchstabens diesen in eine Temp-Datei schreiben und am Beginn der Batchdatei das Vorhandensein dieser Datei überprüfen - wenn vorhanden, Buchstaben auslesen, damit Netzlaufwerk trennen und Temp-Datei löschen; wenn nicht vorhanden, weiter wie bisher.
Risiko dabei: Wenn bei der letzten Verbindung keine Trennung erfolgte, steht der "alte" Laufwerksbuchstabe weiterhin in der Temp-Datei; sollte inzwischen ein anderes Laufwerk diesen Buchstaben erhalten haben, würde beim nächsten Aufruf der Batchdatei versucht, dieses Laufwerk zu trennen ...
Grüße
bastla
Hallo werner500!
Der "net use"-Befehl zeigt alle gespeicherten Netzwerkverbindungen, auch wenn aktuell kein Laufwerksbuchstabe zugeordnet ist - daher zusätzlich die Überprüfung, ob das letzte Zeichen (%L:~-1%) des gelesenen Eintrages ein ":" ist.
Grüße
bastla
P.S.: "@echo off & setlocal" brauchts Du nur einmal (ganz am Anfang)
Was mache ich nun am geschickesten??
Da "if exist *:\WasWeisIch\ahenci2.txt goto disconnect" nicht funktioniert, vielleicht noch etwas ganz Anderes:@echo off & setlocal
set L=
for /f "tokens=2" %%i in ('net use^|findstr "\\Ser\Allerlei"') do set "L=%%i"
if not defined L goto :Verbinden
if "%L:~-1" neq ":" goto :Verbinden
echo Laufwerk verbunden mit Buchstabe %L% - wird getrennt ...
net use %L% /d
goto :eof
:Verbinden
...
...
Grüße
bastla
P.S.: "@echo off & setlocal" brauchts Du nur einmal (ganz am Anfang)
Hallo werner500!
Etwa so:
Wenn Du für die Ausgabe des "Trenn-Hinweises" zusätzlich / alternativ das Popup verwenden willst, einfach den ganzen Block oben nochmals einsetzen und die Texte anpassen.
Grüße
bastla
[Edit] Fehlendes % in "if "%L:~-1%" neq ":" goto :Verbinden" nachgetragen. [/Edit]
Etwa so:
@echo off & setlocal
set L=
for /f "tokens=2" %%i in ('net use^|findstr "\\Ser\Allerlei"') do set "L=%%i"
if not defined L goto :Verbinden
if "%L:~-1%" neq ":" goto :Verbinden
echo ################################################
echo # #
echo # Verbindung für Laufwerk %L% wird getrennt #
echo # #
echo ################################################
echo.
echo.
net use %L% /d
ping localhost -n 8 >NUL
goto :eof
:Verbinden
echo ##################################################
echo # #
echo # Eine Verbindung zum Server wird aufgebaut! #
echo # #
echo ##################################################
echo.
set "GFDL=%temp%\GetFreeDriveLetter.vbs"
echo For Each D In CreateObject("Scripting.FileSystemObject").Drives:sL=sL^&D.DriveLetter:Next>"%GFDL%"
echo For i=68 To 90:If InStr(UCase(sL),Chr(i))=0 Then WScript.Echo Chr(i):WScript.Quit>>"%GFDL%"
echo Next>>"%GFDL%"
set LW=
for /f %%i in ('cscript //nologo "%GFDL%"') do set LW=%%i
del "%GFDL%"
if not defined LW echo Kein freier Laufwerksbuchstabe gefunden! & pause & goto :eof
ping -n 1 -i 135 -w 130 Ser
if errorlevel 1 goto seoff
net use %LW%: \\Ser\Allerlei /user:Geheim secret /persistent:no >nul
echo.
echo.
echo ##################################################
echo # #
echo # Bitte warten ... #
echo # #
echo ##################################################
Explorer "%LW%:\"
ping localhost -n 8 >NUL
Exit
:seoff
echo.
echo.
echo.
echo ##################################################
echo # #
echo # Der Server ist offline! #
echo # Versuche es spaeter nocheinmal! #
echo # #
echo ##################################################
set "Popup=%temp%\Popup.vbs"
echo R=WScript.CreateObject("WScript.Shell").Popup(WScript.Arguments(0),WScript.Arguments(1),WScript.Arguments(2),vbInformation)>"%Popup%"
wscript //nologo "%Popup%" "Der Server ist offline! Versuche es spaeter nocheinmal!" 8 "Server offline"
del "%Popup%"
Wenn Du für die Ausgabe des "Trenn-Hinweises" zusätzlich / alternativ das Popup verwenden willst, einfach den ganzen Block oben nochmals einsetzen und die Texte anpassen.
Grüße
bastla
[Edit] Fehlendes % in "if "%L:~-1%" neq ":" goto :Verbinden" nachgetragen. [/Edit]
Hallo werner500!
Versuch vorweg bitte noch folgende geänderte Zeile:
Damit wird bei der Suche nach der Freigabe "\\Ser\Allerlei" Klein- und Großschreibung nicht unterschieden.
Falls das nicht genügt, ändere bitte das "echo off" in der ersten Zeile auf "echo on" und starte von der Kommandozeile ("Start / Ausführen... / cmd") mit
In der Log.txt siehst Du dann die einzelnen Befehle vor der Ausführung angezeigt und kannst damit den Ablauf nachvollziehen.
Wenn Du gerade in der Kommandozeile bist, kannst Du auch noch mit
eine Liste der Laufwerksmappings erstellen.
Poste bitte beide Textdateien in < code>-Tags.
Grüße
bastla
Versuch vorweg bitte noch folgende geänderte Zeile:
for /f "tokens=2" %%i in ('net use^|findstr /i "\\Ser\Allerlei"') do set "L=%%i"
Falls das nicht genügt, ändere bitte das "echo off" in der ersten Zeile auf "echo on" und starte von der Kommandozeile ("Start / Ausführen... / cmd") mit
C:\Pfad\DeineBatchdatei.bat > C:\Log.txt
Wenn Du gerade in der Kommandozeile bist, kannst Du auch noch mit
net use > C:\Net.txt
Poste bitte beide Textdateien in < code>-Tags.
Grüße
bastla
Hallo werner500!
) ...
In der Zeile
fehlt ein %-Zeichen (zwischen 1 und ") - ich trage es oben auch noch nach.
Das CMD-Fenster ging übrigens so schnell zu, weil Du ein "exit" im Code hast - wenn Du dieses durch "goto :eof" ersetzt, bleibt das Fenster offen.
Grüße
bastla
Ich hoffe du kannst damit etwas anfangen =))
Kann ich, und zwar mich ärgern (über mich In der Zeile
if "%L:~-1" neq ":" goto :Verbinden
Das CMD-Fenster ging übrigens so schnell zu, weil Du ein "exit" im Code hast - wenn Du dieses durch "goto :eof" ersetzt, bleibt das Fenster offen.
Grüße
bastla