Board logo

标题: [其他] 批处理获取U盘、可移动硬盘的盘符(2015-01-14更新) [打印本页]

作者: Batcher    时间: 2009-3-3 16:38     标题: 批处理获取U盘、可移动硬盘的盘符(2015-01-14更新)

我们应该用批处理做些实用的事情,本帖旨在讨论批处理中如何获取可移动磁盘的盘符(以便自动实现一些针对可移动磁盘的文件/文件夹操作),而不是纯粹为了显示一下可移动磁盘的盘符是什么(没有什么意义的事情还是少做为妙)。如果您的代码只是显示了一下findstr的结果或者直接echo了一下,请先尝试一下把结果保存到一个变量里面吧。

本帖讨论的只是方法,对于多于1个可移动磁盘情况,我们在这里不予过多讨论,如果您觉得有必要,请到相应版块单独发帖。

【方案一】fsutil
  1. @echo off
  2. for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  3.     for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "Removable.* 可移动"') do (
  4.         set DriveU=%%h
  5.     )
  6. )
  7. echo,%DriveU%
  8. pause
复制代码
【方案二】WMIC
  1. @echo off
  2. for /f "tokens=2 delims==" %%a in ('wmic LogicalDisk where "DriveType='2'" get DeviceID /value') do (
  3.     set DriveU=%%a
  4. )
  5. echo,%DriveU%
  6. pause
复制代码
【方案三】BAT + VBS (优点是可以兼容Win2000系统)
  1. @echo off
  2. for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
  3.     more +%%i "%~f0" > "%temp%\GetU.vbs"
  4. )
  5. for /f %%a in ('cscript /nologo "%temp%\GetU.vbs"') do (
  6.     set "DriveU=%%a"
  7. )
  8. echo,%DriveU%
  9. pause
  10. goto :eof
  11. :DynamicScript
  12. Set Fso = CreateObject("Scripting.FileSystemObject")
  13. Set B = Fso.Drives
  14. For Each A in B
  15.     If A.DriveType = 1 Then
  16.         aDisk = aDisk & A.DriveLetter & ": "
  17.     End If
  18. Next
  19. aDisk = Replace(aDisk, "A: ","")
  20. WScript.Echo aDisk
复制代码

作者: lianxi    时间: 2009-3-8 19:21

感谢楼主!但是我想问一下,当我插的是两个U盘的时候怎么办?
作者: zqz0012005    时间: 2009-3-8 19:25

set DriveU=%%h
改为
set /a n+=1&call set DriveU%%n%%=%%h

最后用set DriveU显示所有的U盘盘符
作者: fsh6666    时间: 2009-3-10 14:18     标题: 回复 1楼 的帖子

'fsutil fsinfo drivetype %%a:^|findstr "Removable 可移动"') do (
    set DriveU=%%h
  不懂  希望解答
作者: Batcher    时间: 2009-3-10 15:25     标题: 回复 4楼 的帖子

运行这个命令
fsutil fsinfo drivetype C:
看看结果
思考一下
作者: wangantao    时间: 2009-3-15 02:16     标题: 【方案一】fsutil

【方案一】fsutil
仅获得盘符

@echo off

for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (

for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "
可移动"') do (

echo.%%h


)

)

@echo off
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do ( fsutil fsinfo drivetype %%a:|findstr "可移动" )

[ 本帖最后由 wangantao 于 2009-3-15 02:34 编辑 ]
作者: Batcher    时间: 2009-3-15 11:35     标题: 回复 6楼 的帖子

请问你想表达什么意思呢?

本帖旨在讨论批处理中如何获取可移动磁盘的盘符(以便自动实现一些针对可移动磁盘的文件/文件夹操作),而不是纯粹为了显示一下可移动磁盘的盘符是什么(没有什么意义的事情还是少做为妙)。如果您的代码只是显示了一下findstr的结果或者直接echo了一下,请先尝试一下把结果保存到一个变量里面吧。
作者: kinsn    时间: 2009-4-7 10:20

正想找这个热处理,谢谢!
作者: BillGates    时间: 2009-4-25 23:23

我的windows home 版怎么提示 wmic不是外部什么什么的。
作者: Batcher    时间: 2009-4-25 23:41     标题: 回复 9楼 的帖子

HOME版系统和精简版系统类似,都是不完整的版本,网友戏称“太监版”或者“阉割版”,不仅无法使用WMIC,还有其它很多功能都被砍掉了。
作者: dosz    时间: 2009-4-26 11:08

回复 7楼 的帖子
  1. @title 查看可移动盘个数及盘符(当我插的是两个U盘的时候)
  2. @echo 1楼的代码无显示(去掉“Removable ”后显示一个:显示:m:)改为3楼的代码无显示
  3. @echo off
  4. for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  5.   for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "Removable 可移动"') do (
  6.     set DriveU=%%h
  7.   )
  8. )
  9. echo.%DriveU%
  10. echo.&pause
  11. @echo  6楼的代码
  12. @echo off
  13. for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  14. for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "可移动"') do (
  15. echo.%%h
  16. )
  17. )
  18. :: 方案一:fsutil 仅获得盘符
  19. :: 显示:l:
  20. :: 显示:m:
  21. echo.&pause
  22. @echo off
  23. for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do ( fsutil fsinfo drivetype %%a:|findstr "可移动" )
  24. :: 显示:l: - 可移动驱动器
  25. :: 显示:m: - 可移动驱动器
  26. echo.&pause
复制代码

作者: dosz    时间: 2009-4-26 11:40

  1. @echo off&title 查看可移动盘个数及盘符&for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do fsutil fsinfo drivetype %%i:| find "可移动"
复制代码

作者: dosz    时间: 2009-4-26 12:24

  1. @echo off&title 可同时打开多个移动盘&for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do fsutil fsinfo drivetype %%i: | find "可移动">nul && start %%i:
复制代码

作者: dosz    时间: 2009-4-26 12:30

:: 附:打开最后一个分区
  1. @echo off
  2. for %%i in (Z Y X W V U T S R Q P O N M L K J I H G F E D C) do (
  3.     if exist %%i:\nul (
  4.         for /f "tokens=3" %%j in ('dir /-c %%i:\') do set freesize=%%j
  5.         set last=%%i
  6.         if not "!freesize!"=="0" goto last_drive
  7.     )
  8. )
  9. goto :eof
  10. :last_drive
  11. explorer  %last%:\
复制代码

作者: Batcher    时间: 2009-4-26 13:46     标题: 回复 11楼 的帖子

1、Removable是为了兼容英文版操作系统,至于你说的中文系统下无法显示的问题,顶楼代码已更新并修复此bug,感谢你的测试。

2、对于多个U盘的情况,3楼的思路是没有问题,至于具体代码如何写,本帖不予过多讨论。

3、本帖主要是为了获取可移动盘符,以便下面自动实现一些针对可移动磁盘的文件/文件夹操作,6楼的代码只是显示了一下可移动盘符而已,偏离了主题,因此你对6楼的代码的修改,我这里也不做过多评论。

4、为了节约论坛空间,如无特殊需要,能用文字描述清楚的时候还是尽量不要贴图吧。
作者: Batcher    时间: 2009-4-26 13:49     标题: 回复 12楼、13楼 的帖子

见15楼回复第三点

关于代码风格的问题,欢迎你参与讨论:批处理bat代码是越短越好吗?
http://bbs.bathome.net/viewthread.php?tid=4026
作者: Batcher    时间: 2009-4-26 13:53     标题: 回复 14楼 的帖子

有代码就拿出来跟大家分享的精神是非常好的,但是请尽量不要把跟主题不相关的代码也一股脑的贴出,如果认为有必要,可以单独发帖。实际上,关于最后分区盘符的问题,本论坛早已有相关帖子讨论过,建议您搜索一下并到那些帖子中继续讨论。我们这个帖子还是以讨论可移动盘符为主吧。
作者: dosz    时间: 2009-4-26 16:40

for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "Removable.* 可移动"') do (
1,楼主由以上的代码 于 2009-4-26 13:39 重新编辑成以下 代码,现在可以显示,但两个U盘中,显示的是后一个,“m:”
      for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "Removable 可移动"') do (
2,6楼的第一个代码显示的是“l:”和“m:”。第二个代码显示的是“l: - 可移动驱动器”和“m: - 可移动驱动器”。
     我不懂,我认为6楼的代码扣了提意,所以贴了个图来,请见谅。
3、本帖主要是为了获取可移动盘符,以便下面自动实现一些针对可移动磁盘的文件/文件夹操作,
     设置U盘背景(dosz整理,只能用于第一个移动盘)
  1. @echo off
  2. title 设置U盘背景(dosz整理,只能用于第一个移动盘)
  3. :start
  4. cls
  5. echo 请插入U盘...
  6. ping -n 4 127.1>nul
  7. for %%i in (c:,d:,e:,f:,g:,h:,i:,j:,k:,l:) do fsutil fsinfo drivetype %%i | find "可移动">nul && echo %%i>>dosz.txt
  8. if not exist dosz.txt goto dd
  9. for /f "tokens=*" %%a in (dosz.txt) do set upanfu=%%a
  10. :shezhi
  11. cls
  12. echo.
  13. set tupian=
  14. set /p tupian=输入要设置为背景的图片路径并回车 (建议直接将图片拖拽到本窗口):
  15. if exist %tupian% goto d
  16. echo.
  17. echo 图片不存在...或输入有误....
  18. echo.
  19. echo 建议直接将图片拖拽到本窗口...
  20. echo.
  21. echo 任意键返回....
  22. pause>nul
  23. goto shezhi
  24. :d
  25. if exist %upanfu%\1.jpg attrib -s -h -r -a %upanfu%\1.jpg
  26. copy %tupian% %upanfu%\1.jpg>nul
  27. if exist %upanfu%\desktop.ini attrib -s -h -r -a %upanfu%\desktop.ini
  28. echo [ExtShellFolderViews]>%upanfu%\desktop.ini
  29. echo [{BE098140-A513-11D0-A3A4-00C04FD706EC}]>>%upanfu%\desktop.ini
  30. echo IconArea_Image=1.jpg>>%upanfu%\desktop.ini
  31. attrib +h %upanfu%\desktop.ini
  32. attrib +h %upanfu%\1.jpg
  33. del dosz.txt /q
  34. echo.
  35. explorer  %upanfu%\
  36. echo.
  37. pause>nul
  38. exit
  39. :dd
  40. echo.
  41. echo 检测不到U盘..任意键返回....
  42. pause>nul
  43. goto start
复制代码

[ 本帖最后由 dosz 于 2009-4-26 17:00 编辑 ]
作者: dosz    时间: 2009-4-26 16:58

谢谢楼主指点,
有代码就拿出来跟大家分享的精神是非常好的,但是请尽量不要把跟主题不相关的代码也一股脑的贴出,如果认为有必要,可以单独发帖。

再问问楼主,我在这里为什么不能发新贴。
谢谢!

[ 本帖最后由 dosz 于 2009-4-26 17:07 编辑 ]
作者: Batcher    时间: 2009-4-26 17:15     标题: 回复 18楼 的帖子

1、顶楼应经说清楚,本帖不讨论多个U盘的情况,如果有需要,稍加修改即可兼容;

2、顶楼业已说明,我们要把盘符保存到一个变量中,而不是仅仅显示一下(没啥用处);

3、我们写代码还是少用临时文件为好,以你这个代码为例,如果用户当前目录下有一个私人文件叫做dosz.txt,里面存放了一些重要的资料,而且有可能其它程序会调用此文件。一旦运行这个批处理,后果将可能相当严重。你也许会说“咱可以把这个临时文件生成到%temp%目录下啊”,首先,某些电脑根本没有%temp%这个系统变量,其次,某些杀软会监控%temp%中新文件的生成并报警(取决于杀软的设置)。总之,能不用临时文件就别用。
作者: dosz    时间: 2009-4-26 17:33

原帖由 Batcher 于 2009-4-26 17:15 发表
1、顶楼应经说清楚,本帖不讨论多个U盘的情况,如果有需要,稍加修改即可兼容;

2、顶楼业已说明,我们要把盘符保存到一个变量中,而不是仅仅显示一下(没啥用处);

3、我们写代码还是少用临时文件为好,以你 ...


非常有道理。
作者: tianya1631    时间: 2009-5-22 23:34

谢谢,收下了,正在找这个呢..
作者: 监守自盗    时间: 2009-5-29 12:01

请教楼主,当我的U盘量产成HDD格式后,就是本地磁盘格式后如何识别呢,楼上所提供的方案均无法识别.
谢谢啦.
原帖地址:http://bbs.bathome.net/viewthrea ... &extra=page%3D1
作者: strong12345    时间: 2009-7-1 12:48

今天看到这问题
小弟以前也想过
我的想法很简单~~
一般的硬碟机理,一定会有 System Volume Information 文件夹
因此只要侦测,磁盘里有没有 System Volume Information
就能判断为硬碟还是随身碟
  1. @ECHO OFF
  2. for %%i in (c 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 exist %%i: (
  3. if not exist "%%i:\System Volume Information" (echo %%i  is USB)))
  4. PAUSE
复制代码


PS 随身碟 = U盘 (台湾用语)

[ 本帖最后由 strong12345 于 2009-7-1 12:51 编辑 ]
作者: foxJL    时间: 2009-7-7 00:10

发一个很久以前写的代码:
  1. @echo off
  2. ::foxjl@bbs.bathome.net
  3. setlocal enabledelayedexpansion
  4. for /f "delims=\" %%i in ('fsutil fsinfo drives^|find /v ""') do (
  5. set var=%%i
  6. for /f "delims=" %%h in ('fsutil fsinfo drivetype !var:~-2!') do (
  7. echo %%h | find "移动">nul && echo %%i
  8. )
  9. )
  10. pause
复制代码

作者: asnahu    时间: 2009-10-6 20:52

个人认为三个方案都有局限,fsutil和wmic是xp系统的且还要管理员权限,vbscript2000以下用不了,要用还得装组件。
作者: dailisishen    时间: 2009-11-10 21:38     标题: 回复 2楼 的帖子

用第一个批,感觉遍历比较管用。。。
多u盘的问题可以用eol忽略掉,进行再次遍历查询,效率有点低就是了

[ 本帖最后由 dailisishen 于 2009-11-10 21:41 编辑 ]
作者: Batcher    时间: 2009-11-10 22:54     标题: 回复 26楼 的帖子

你有什么好的建议呢?
作者: hbwazxf    时间: 2011-3-1 17:46

很强大。。。很好……
作者: 小胖狐狸    时间: 2011-11-9 14:10

今天要用,搜到了这个帖子,很好很好
看了大家的讨论也收获颇丰

楼主的意思很合我的心意,要的就是把盘符赋值到一个变量中供后续调用,只是在屏幕上显示一下的话,没有意义
只不过关于U盘/移动硬盘,被系统识别为“本地硬盘“的情况,似乎确实不好处理
作者: garyng    时间: 2011-11-9 19:01

回复 31# 小胖狐狸


    哈哈~
大开眼界了吧~
楼主可是管理员啊~
可资深咯~
新手吧~
多多学习吧~
作者: 小胖狐狸    时间: 2011-11-10 10:16

回复 32# garyng


    是的,要学的还很多
作者: taqiao    时间: 2011-11-24 15:49

经典,收藏了
作者: web    时间: 2012-10-16 22:05

还是有用的
作者: 飛雪    时间: 2015-2-27 10:16

很強大的批處理
對於工作上有幫助
特別感謝
作者: 9859270@qq.com    时间: 2016-5-27 16:08

吃饭GVvvgbfki
作者: zhangth    时间: 2017-4-6 11:27

如何用批处理定位U盘或移动硬盘,并且把找到的盘自动带入下一个批处理命令???


在线等
作者: cfwyy77_bat    时间: 2019-11-8 09:45

原谅我把版主大大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中的类什么的,东西太多了,我也不熟,找到啥用啥)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. wmic DiskDrive where "InterfaceType='USB'" 2>&1 |findstr "没有可用实例" >nul
  4. if not errorlevel 1 (
  5. echo 没有找到U盘,请确认先插入U盘!
  6. ) else (
  7. for /f "skip=1" %%a in ('wmic DiskDrive where "InterfaceType='USB'" get DeviceID ^|findstr "."') do (
  8. set diskName=%%a
  9. set diskID=!diskName:~-1,1!
  10. )
  11. set diskName=Disk #!diskID!
  12. for /f "tokens=7 delims== " %%a in ('wmic path win32_LogicalDiskToPartition ^|findstr /c:"!diskName!"') do (set U=%%a)
  13. set U=!U:~1,2!
  14. echo 已找到U盘,盘符为 !U!
  15. rem 找到后可做后续操作。
  16. )
  17. pause
复制代码
我在win8,win10下测试都通过,不管U盘识别成可移动还是本地磁盘,都成正确读出盘符。
写的不对的地方,请指正。
作者: abc46872963    时间: 2022-1-23 14:01

回复 3# zqz0012005 不理解 应该怎么写啊
作者: LJY4.0    时间: 2022-4-25 18:10

回复 4# fsh6666


   
'fsutil fsinfo drivetype %%a:^|findstr "Removable 可移动"') do (
    set DriveU=%%h
意思是盘符有没有带有Removable 可移动这几个字样,有就是U盘
不过U盘可能会被改名,所以不推荐




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2