原谅我把版主大大10年前的好帖又翻出来了
最近有需求,要先找到插入的一个U盘,再做后续的操作。(只考虑一个U盘一个分区的情况,一个U盘多分区多个U盘不考虑)
本帖给的三种方法 基本是以 DriveType =可移动磁盘 来判断是否是U盘,这个一般情况下问题不大,但是现在越来越多的U盘不适用了,因为很多U盘出厂时磁盘类型是 本地磁盘 ,windows上选盘符,右键属性中可以看到。我现在手上的一个闪迪的,一个Kingston的windows识别出来都是 本地磁盘,所以这三种方法都失效了。
后来我就找其它的方法,网上有找到 C++调用原生的windowsAPI的方法(通过BUSType判断),不过太复杂不太想用,完全搞懂得windowsAPI函数的参数都要半天(这方面不太熟悉,熟的人应该也很快)。后来还是找到有相关的判断U盘磁盘的方法,原本是用powershell的,调用的还是用WMI,只不过不用WMI其它的类。我还是改成用bat来写了。
主要方法就是先用 WMI 中DiskDrive类 的InterfaceType属性是否为'USB' 来判断U盘,
再用win32_LogicalDiskToPartition 类中通过磁盘找到对应的分区的盘符。(WMI中的类什么的,东西太多了,我也不熟,找到啥用啥)- @echo off
- setlocal enabledelayedexpansion
- wmic DiskDrive where "InterfaceType='USB'" 2>&1 |findstr "没有可用实例" >nul
- if not errorlevel 1 (
- echo 没有找到U盘,请确认先插入U盘!
- ) else (
- for /f "skip=1" %%a in ('wmic DiskDrive where "InterfaceType='USB'" get DeviceID ^|findstr "."') do (
- set diskName=%%a
- set diskID=!diskName:~-1,1!
- )
- set diskName=Disk #!diskID!
- for /f "tokens=7 delims== " %%a in ('wmic path win32_LogicalDiskToPartition ^|findstr /c:"!diskName!"') do (set U=%%a)
- set U=!U:~1,2!
- echo 已找到U盘,盘符为 !U!
- rem 找到后可做后续操作。
- )
- pause
复制代码 我在win8,win10下测试都通过,不管U盘识别成可移动还是本地磁盘,都成正确读出盘符。
写的不对的地方,请指正。 |