Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-10-30

GetLogicalDrives

Я тут ныл недавно, что в вин7 отменили авторан. Говорил, что надо что-то придумать. Я придумал: надо написать утилитку, которая при запуске выполняет команду из авторана. Первая часть утилитки уже готова.

Познакомься Алиса, это функция, сырая но рабочая. Она возвращает список буков для всех дисковых томов в MS Windows. Пока я лазил по форумам, обнаружилось, что есть аж 4 метода получения такого списка. В функцию я затолкал все четыре, на всякий случай. Народ говорит, что самая толковая реализация — номер 1.

Python:
def getLogicalDrives(meth = '1'):
 res = []
 print 'getLogicalDrives...'
 # good one (http://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python)
 if meth == '1':
  import string
  from ctypes import windll
  drives = []
  bitmask = windll.kernel32.GetLogicalDrives()
  for letter in string.uppercase:
   if bitmask & 1:
    drives.append(letter)
   bitmask >>= 1
  res = sorted(drives)
 elif meth == '2':
  import win32api
  drives = win32api.GetLogicalDriveStrings()
  drives = sorted(drives.split('\000'))
  for s in drives:
   s = s.strip()
   if s: res.append(s[0:1])
 elif meth == '3': # no network mounts
  import os, re
  drives = re.findall(r"[A-Z]+:.*$",os.popen("mountvol /").read(),re.MULTILINE)
  for s in drives:
   s = s.strip()
   if s: res.append(s[0:1])
 # MS wbem (http://gallery.technet.microsoft.com/scriptcenter/488836b0-84e9-4c0c-b2cf-dd19f6e70f74)
 elif meth == '4':
  ''' DriveType, DeviceID
  http://msdn.microsoft.com/en-us/library/windows/desktop/aa394173%28v=vs.85%29.aspx
  '''
  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:
   s = objItem.DeviceID.strip().encode('utf8')
   if s: res.append(s[0:1])
   continue
   print '#' * 80
   print "Access: ", objItem.Access
   print "Availability: ", objItem.Availability
   print "Block Size: ", objItem.BlockSize
   print "Caption: ", objItem.Caption
   print "Compressed: ", objItem.Compressed
   print "Config Manager Error Code: ", objItem.ConfigManagerErrorCode
   print "Config Manager User Config: ", objItem.ConfigManagerUserConfig
   print "Creation Class Name: ", objItem.CreationClassName
   print "Description: ", objItem.Description
   print "Device ID: ", objItem.DeviceID # C:
   print "Drive Type: ", objItem.DriveType # 2 - removable disk
   print "Error Cleared: ", objItem.ErrorCleared
   print "Error Description: ", objItem.ErrorDescription
   print "Error Methodology: ", objItem.ErrorMethodology
   print "File System: ", objItem.FileSystem
   print "Free Space: ", objItem.FreeSpace
   print "Install Date: ", objItem.InstallDate
   print "Last Error Code: ", objItem.LastErrorCode
   print "Maximum Component Length: ", objItem.MaximumComponentLength
   print "Media Type: ", objItem.MediaType
   print "Name: ", objItem.Name
   print "Number Of Blocks: ", objItem.NumberOfBlocks
   print "PNP Device ID: ", objItem.PNPDeviceID
   print "Provider Name: ", objItem.ProviderName
   print "Purpose: ", objItem.Purpose
   print "Quotas Disabled: ", objItem.QuotasDisabled
   print "Quotas Incomplete: ", objItem.QuotasIncomplete
   print "Quotas Rebuilding: ", objItem.QuotasRebuilding
   print "Size: ", objItem.Size
   print "Status: ", objItem.Status
   print "Status Info: ", objItem.StatusInfo
   print "Supports Disk Quotas: ", objItem.SupportsDiskQuotas
   print "Supports File-Based Compression: ", objItem.SupportsFileBasedCompression
   print "System Creation Class Name: ", objItem.SystemCreationClassName
   print "System Name: ", objItem.SystemName
   print "Volume Dirty: ", objItem.VolumeDirty
   print "Volume Name: ", objItem.VolumeName
   print "Volume Serial Number: ", objItem.VolumeSerialNumber
   print "Power Management Supported: ", objItem.PowerManagementSupported
   z = objItem.PowerManagementCapabilities
   if z is None:
    a = 1
   else:
    for x in z:
     print "Power Management Capabilities: ", x
 else:
  raise NameError('getLogicalDrives, error: unknown method')
 return sorted(res, reverse=True)
#def getLogicalDrives():

Пока что эта функция помогает мне найти (для последующего запуска) мою мувишелл на подключаемом диске. Довольно удобно: подключил диск, подождал, пока проморгается, щелканул ярлык на рабочем столе — опля, смотри кино.

Кстати, о птичках. Обнаружилось, что в вин7 некорректно определяются размеры экрана функциями Tkinter (w, h = tk.winfo_screenwidth(), tk.winfo_screenheight()). Так что надо переписывать еще и код разворачивания окна на весь экран.

О, стихи родились: Луч поноса посылаю чувакам из Микрософт.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)