hallo zusammen,
ich wette ich bin bei weitem nicht der erste der vor diesem problem steht und micht wundert grad echt derb warum man wirklich NIRGENDS was dazu findet.
aber zu meinem problem:
ich verwende windows und will dynamisch zur laufzeit ein neues laufwerk mounten, dazu sollte ich aber wissen welche laufwerksbuchstaben überhaupt noch frei sind...wer kann mir da ne hilfe geben ???
mfg
BigBo
erster freier laufwerksbuchstabe unter windows
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo BigBo!BigBo hat geschrieben:dazu sollte ich aber wissen welche laufwerksbuchstaben überhaupt noch frei sind
Vielelicht ist hier etwas für dich darunter:
- http://timgolden.me.uk/python/wmi_cookbook.html
- http://www.microsoft.com/technet/script ... x?mfr=true
- http://www.microsoft.com/technet/script ... x?mfr=true
EDIT 1:
Ja, es ist etwas dabei:
Code: Alles auswählen
import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
for objItem in colItems:
#print "Caption: ", objItem.Caption
#print "Description: ", objItem.Description
#print "Device ID: ", objItem.DeviceID
print "Name: ", objItem.Name
Vielleicht gibt es sogar einen eigenen Befehl um die freien Laufwerksbuchstaben heraus zu finden, aber den kenne ich nicht.
EDIT 2:
Wer sagt's denn:
Code: Alles auswählen
>>> import win32api
>>> win32api.GetLogicalDriveStrings()
'A:\\\x00C:\\\x00H:\\\x00J:\\\x00P:\\\x00T:\\\x00U:\\\x00W:\\\x00'
>>> print win32api.GetLogicalDriveStrings()
A:\
>>> print win32api.GetLogicalDriveStrings().split(chr(0))
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\', '']
>>> print [ item for item in win32api.GetLogicalDriveStrings().split(chr(0)) if item ]
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\']
>>> print win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))
['A:\\', 'C:\\', 'H:\\', 'J:\\', 'P:\\', 'T:\\', 'U:\\', 'W:\\']
>>> import string
>>> string.ascii_uppercase[2:]
'CDEFGHIJKLMNOPQRSTUVWXYZ'
>>> set(string.ascii_uppercase[2:]).difference(set(item[0] for item in win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))))
set(['E', 'D', 'G', 'F', 'I', 'K', 'M', 'L', 'O', 'N', 'Q', 'S', 'R', 'V', 'Y', 'X', 'Z'])
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- User
- Beiträge: 18
- Registriert: Mittwoch 5. September 2007, 13:16
- Wohnort: Friedrichshafen
- Kontaktdaten:
ja mit win32api.getLogicalDriveStrings() bekomm ich die schon belegten laufwerke...aber wie iteriere ich am blödsten in ner schleife zum ersten freien möglichst OHNE manuell ne liste mit allen buchstaben von a-z anzulegen? ich denk sowas zu machen wäre unschöner codegerold hat geschrieben:Vielleicht gibt es sogar einen eigenen Befehl um die freien Laufwerksbuchstaben heraus zu finden, aber den kenne ich nicht.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
...finde ich nicht.BigBo hat geschrieben:mit allen buchstaben von a-z anzulegen? ich denk sowas zu machen wäre unschöner code
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- User
- Beiträge: 18
- Registriert: Mittwoch 5. September 2007, 13:16
- Wohnort: Friedrichshafen
- Kontaktdaten:
also ich habs nun so gelöst:
wenn jemand was besseres weiss bitte melden, ich find die lösung ziemlich hässlich aber mir fällt keine andere ein
und gerold ich bin dir mal wieder zu vielem dank verpflichtet...du hast mich auf gute ideen gebracht wie ich mein problem lösen könnte
Code: Alles auswählen
for letter in 'DEFGHIJKLMNOPQRSTUVWXYZ':
if letter in (win32api.GetLogicalDriveStrings().rstrip(chr(0)).split(chr(0))):
continue
else:
freeDrive = letter
break
und gerold ich bin dir mal wieder zu vielem dank verpflichtet...du hast mich auf gute ideen gebracht wie ich mein problem lösen könnte
Ich weiss nicht was `win32api.GetLogicalDriveStrings()` macht, aber muss man das wirklich für jeden Buchstaben aufrufen!?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wo zum Teufel ist B? Und warum heißt meine Platte heute E nachdem sie gestern noch D war?blackbird hat geschrieben:Hab ich schonmal erwähnt, dass ich Laufwerksbuchstaben für eine strohdumme Idee halte?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Das traurige ist ja, dass der NT Kernel eigentlich gar keine Laufwerksbuchstaben mehr braucht. Intern werden Laufwerke wie bei udev über IDs angesprochen. Im Kernel sind die Laufwerksbuchstaben nur noch Mountpoints, die mit dem Laufwerk nichts mehr zu tun haben.
Bei Windows XP (afaik auch schon bei 2000) kann man ja NTFS Partitionen in beliebige Verzeichnisse einhängen (genau wie bei "mount"). Ebenso kann man Laufwerksbuchstaben frei zuweisen. Es würde auch ohne gehen...
... nur hängt die behämmerte Shell an den Laufwerksbuchstaben, und MS mag das scheints nicht ändern, ein normaler Windows-User ist ja so gutes Design gar nicht gewöhnt...
Bei Windows XP (afaik auch schon bei 2000) kann man ja NTFS Partitionen in beliebige Verzeichnisse einhängen (genau wie bei "mount"). Ebenso kann man Laufwerksbuchstaben frei zuweisen. Es würde auch ohne gehen...
... nur hängt die behämmerte Shell an den Laufwerksbuchstaben, und MS mag das scheints nicht ändern, ein normaler Windows-User ist ja so gutes Design gar nicht gewöhnt...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Jup. Deswegen kann man auch leicht in der REG bei HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices die Laufwerkbuchstaben wieder anders zuordnen, wenn Windows sich über den normalen Weg sträubt.lunar hat geschrieben:Im Kernel sind die Laufwerksbuchstaben nur noch Mountpoints, die mit dem Laufwerk nichts mehr zu tun haben.
Mit dieser kleinen Batch-Datei kommt man direkt in regedit an die richtige stelle:
Code: Alles auswählen
set Key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit
set LastKey=HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
reg add %Key% /f /v "LastKey" /d %LastKey%
start regedit.exe
EDIT: Wobei ich nicht weiß, was bei CD-/DVD-Laufwerken passiert, wenn keine CD/DVD eingelegt ist. Also vielleicht keine gute Idee