Python检测USB驱动器并分配驱动器字母?

3

这里有一个问题。我们有数百个外部的500GB USB驱动器。每个驱动器将在全年内移动到新的位置。什么是最好的方法可以自动检测到USB驱动器已插入Windows系统,然后分配Z:\驱动器号?这些USB驱动器将插入许多不同的计算机,因此需要编写脚本来实现。

import subprocess

diskpart_data = "z-drive.txt"
open (diskpart_data, "w").write ("""
select volume F: 
assign letter=Z
""")
subprocess.call ('diskpart /s %s' % diskpart_data)

由于移动USB驱动在不同的Windows系统上具有动态性,因此使用它可能会很困难。您能否通过WMI自动检测或进行某种NTFS卷挂载来解决这个问题?


如果 Z: 驱动器已经在插入它的计算机上使用,您会期望发生什么? - Jim B
脚本需要放在驱动器上还是插入到每台Windows机器上都需要? - slurdge
@Jim B 我们选择Z:\驱动器,因为它在当前环境中没有被使用。客户也会提前知道,在运行此脚本时不要映射z:\驱动器。@slurdge 我们获取一个USB驱动器,运行另一个Python脚本,将6,000个视频移动到一个视频目录中。然后,我们使用访问模块在报告中创建超链接,引用这些视频。因此,可以在整个系统中使用映射z:\videos<filename>,并且不会破坏报告中的链接。 - Dunwitch
2个回答

2
如 terabytest 所说,您可以从驱动器根目录中的 autorun.inf 运行脚本。个人建议使用批处理脚本:
(echo select volume %~d0 && echo assign letter=Z) | diskpart

%~d0会检索当前正在执行的批处理文件的驱动器号。

如果这不足够,可以使用Windows API的设备管理函数来在插入可移动驱动器时得到通知。你需要首先使用RegisterDeviceNotification()注册通知,然后在事件循环中处理WM_DEVICECHANGE消息。不幸的是,这需要一个事件循环,我不知道如何在Python中轻松创建一个(除了从头开始创建:这里是一个消息循环示例,请注意,在您的情况下,您不需要创建窗口,只需有一个消息循环即可)。


1
你可以尝试将该脚本编译为exe文件,并在USB键中创建一个自动运行文件来运行该脚本。然后脚本就会执行它的任务。
对于分配Z:\盘符的问题,我建议使用Win32Com(尽管我不知道它是否能够处理这个问题),或者使用ctypes,这将让你控制Windows dlls。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接