批处理获取U盘、可移动硬盘的盘符(2015-01-14更新)
我们应该用批处理做些实用的事情,本帖旨在讨论批处理中如何获取可移动磁盘的盘符(以便自动实现一些针对可移动磁盘的文件/文件夹操作),而不是纯粹为了显示一下可移动磁盘的盘符是什么(没有什么意义的事情还是少做为妙)。如果您的代码只是显示了一下findstr的结果或者直接echo了一下,请先尝试一下把结果保存到一个变量里面吧。本帖讨论的只是方法,对于多于1个可移动磁盘情况,我们在这里不予过多讨论,如果您觉得有必要,请到相应版块单独发帖。
【方案一】fsutil[code]@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 "Removable.* 可移动"') do (
set DriveU=%%h
)
)
echo,%DriveU%
pause[/code]【方案二】WMIC[code]@echo off
for /f "tokens=2 delims==" %%a in ('wmic LogicalDisk where "DriveType='2'" get DeviceID /value') do (
set DriveU=%%a
)
echo,%DriveU%
pause[/code]【方案三】BAT + VBS (优点是可以兼容Win2000系统)[code]@echo off
for /f "delims=:" %%i in ('findstr /n "^:DynamicScript$" "%~f0"') do (
more +%%i "%~f0" > "%temp%\GetU.vbs"
)
for /f %%a in ('cscript /nologo "%temp%\GetU.vbs"') do (
set "DriveU=%%a"
)
echo,%DriveU%
pause
goto :eof
:DynamicScript
Set Fso = CreateObject("Scripting.FileSystemObject")
Set B = Fso.Drives
For Each A in B
If A.DriveType = 1 Then
aDisk = aDisk & A.DriveLetter & ": "
End If
Next
aDisk = Replace(aDisk, "A: ","")
WScript.Echo aDisk
[/code] 感谢楼主!但是我想问一下,当我插的是两个U盘的时候怎么办? set DriveU=%%h
改为
set /a n+=1&call set DriveU%%n%%=%%h
最后用set DriveU显示所有的U盘盘符
回复 1楼 的帖子
'fsutil fsinfo drivetype %%a:^|findstr "Removable 可移动"') do (set DriveU=%%h
不懂 希望解答
回复 4楼 的帖子
运行这个命令fsutil fsinfo drivetype C:
看看结果
思考一下
【方案一】fsutil
[font=宋体]【方案一】[/font][font=Times New Roman]fsutil[/font][font=宋体]仅获得盘符[/font]
[font=Times New Roman]
@echo off[/font]
[font=Times New Roman]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 ([/font]
[font=Times New Roman]
for /f %%h in ('fsutil fsinfo drivetype %%a:^|findstr "[/font][font=宋体]可移动[/font][font=Times New Roman]"') do ([/font]
[font=Times New Roman]
echo.%%h[/font]
[font=Times New Roman]
)[/font]
[font=Times New Roman])[/font]
@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 "可移动" )
[[i] 本帖最后由 wangantao 于 2009-3-15 02:34 编辑 [/i]]
回复 6楼 的帖子
请问你想表达什么意思呢?本帖旨在讨论批处理中如何获取可移动磁盘的盘符(以便自动实现一些针对可移动磁盘的文件/文件夹操作),而不是纯粹为了显示一下可移动磁盘的盘符是什么(没有什么意义的事情还是少做为妙)。如果您的代码只是显示了一下findstr的结果或者直接echo了一下,请先尝试一下把结果保存到一个变量里面吧。 正想找这个热处理,谢谢! 我的windows home 版怎么提示 wmic不是外部什么什么的。
回复 9楼 的帖子
HOME版系统和精简版系统类似,都是不完整的版本,网友戏称“太监版”或者“阉割版”,不仅无法使用WMIC,还有其它很多功能都被砍掉了。 [b]回复 7楼 的帖子[/b][code]@title 查看可移动盘个数及盘符(当我插的是两个U盘的时候)@echo 1楼的代码无显示(去掉“Removable ”后显示一个:显示:m:)改为3楼的代码无显示
@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 "Removable 可移动"') do (
set DriveU=%%h
)
)
echo.%DriveU%
echo.&pause
@echo 6楼的代码
@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
)
)
:: 方案一:fsutil 仅获得盘符
:: 显示:l:
:: 显示:m:
echo.&pause
@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 "可移动" )
:: 显示:l: - 可移动驱动器
:: 显示:m: - 可移动驱动器
echo.&pause[/code] [code]@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 "可移动"[/code] [code]@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:[/code] :: 附:打开最后一个分区
[code]
@echo off
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 (
if exist %%i:\nul (
for /f "tokens=3" %%j in ('dir /-c %%i:\') do set freesize=%%j
set last=%%i
if not "!freesize!"=="0" goto last_drive
)
)
goto :eof
:last_drive
explorer %last%:\
[/code]
回复 11楼 的帖子
1、Removable是为了兼容英文版操作系统,至于你说的中文系统下无法显示的问题,顶楼代码已更新并修复此bug,感谢你的测试。2、对于多个U盘的情况,3楼的思路是没有问题,至于具体代码如何写,本帖不予过多讨论。
3、本帖主要是为了获取可移动盘符,以便下面自动实现一些针对可移动磁盘的文件/文件夹操作,6楼的代码只是显示了一下可移动盘符而已,偏离了主题,因此你对6楼的代码的修改,我这里也不做过多评论。
4、为了节约论坛空间,如无特殊需要,能用文字描述清楚的时候还是尽量不要贴图吧。
回复 12楼、13楼 的帖子
见15楼回复第三点关于代码风格的问题,欢迎你参与讨论:批处理bat代码是越短越好吗?
[url]http://bbs.bathome.net/viewthread.php?tid=4026[/url]
回复 14楼 的帖子
有代码就拿出来跟大家分享的精神是非常好的,但是请尽量不要把跟主题不相关的代码也一股脑的贴出,如果认为有必要,可以单独发帖。实际上,关于最后分区盘符的问题,本论坛早已有相关帖子讨论过,建议您搜索一下并到那些帖子中继续讨论。我们这个帖子还是以讨论可移动盘符为主吧。 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楼的代码扣了提意,所以贴了个图来,请见谅。
[color=red]3、本帖主要是为了获取可移动盘符,以便下面自动实现一些针对可移动磁盘的文件/文件夹操作,[/color]
设置U盘背景(dosz整理,只能用于第一个移动盘)[code]
@echo off
title 设置U盘背景(dosz整理,只能用于第一个移动盘)
:start
cls
echo 请插入U盘...
ping -n 4 127.1>nul
for %%i in (c:,d:,e:,f:,g:,h:,i:,j:,k:,l:) do fsutil fsinfo drivetype %%i | find "可移动">nul && echo %%i>>dosz.txt
if not exist dosz.txt goto dd
for /f "tokens=*" %%a in (dosz.txt) do set upanfu=%%a
:shezhi
cls
echo.
set tupian=
set /p tupian=输入要设置为背景的图片路径并回车 (建议直接将图片拖拽到本窗口):
if exist %tupian% goto d
echo.
echo 图片不存在...或输入有误....
echo.
echo 建议直接将图片拖拽到本窗口...
echo.
echo 任意键返回....
pause>nul
goto shezhi
:d
if exist %upanfu%\1.jpg attrib -s -h -r -a %upanfu%\1.jpg
copy %tupian% %upanfu%\1.jpg>nul
if exist %upanfu%\desktop.ini attrib -s -h -r -a %upanfu%\desktop.ini
echo [ExtShellFolderViews]>%upanfu%\desktop.ini
echo [{BE098140-A513-11D0-A3A4-00C04FD706EC}]>>%upanfu%\desktop.ini
echo IconArea_Image=1.jpg>>%upanfu%\desktop.ini
attrib +h %upanfu%\desktop.ini
attrib +h %upanfu%\1.jpg
del dosz.txt /q
echo.
explorer %upanfu%\
echo.
pause>nul
exit
:dd
echo.
echo 检测不到U盘..任意键返回....
pause>nul
goto start[/code]
[[i] 本帖最后由 dosz 于 2009-4-26 17:00 编辑 [/i]] 谢谢楼主指点,
[quote]有代码就拿出来跟大家分享的精神是非常好的,但是请尽量不要把跟主题不相关的代码也一股脑的贴出,如果认为有必要,可以单独发帖。[/quote]
再问问楼主,我在这里为什么不能发新贴。
谢谢!
[[i] 本帖最后由 dosz 于 2009-4-26 17:07 编辑 [/i]]
回复 18楼 的帖子
1、顶楼应经说清楚,本帖不讨论多个U盘的情况,如果有需要,稍加修改即可兼容;2、顶楼业已说明,我们要把盘符保存到一个变量中,而不是仅仅显示一下(没啥用处);
3、我们写代码还是少用临时文件为好,以你这个代码为例,如果用户当前目录下有一个私人文件叫做dosz.txt,里面存放了一些重要的资料,而且有可能其它程序会调用此文件。一旦运行这个批处理,后果将可能相当严重。你也许会说“咱可以把这个临时文件生成到%temp%目录下啊”,首先,某些电脑根本没有%temp%这个系统变量,其次,某些杀软会监控%temp%中新文件的生成并报警(取决于杀软的设置)。总之,能不用临时文件就别用。 [quote]原帖由 [i]Batcher[/i] 于 2009-4-26 17:15 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=27809&ptid=3569][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
1、顶楼应经说清楚,本帖不讨论多个U盘的情况,如果有需要,稍加修改即可兼容;
2、顶楼业已说明,我们要把盘符保存到一个变量中,而不是仅仅显示一下(没啥用处);
3、我们写代码还是少用临时文件为好,以你 ... [/quote]
非常有道理。 谢谢,收下了,正在找这个呢.. 请教楼主,当我的U盘量产成HDD格式后,就是本地磁盘格式后如何识别呢,楼上所提供的方案均无法识别.
谢谢啦.
原帖地址:[url]http://bbs.bathome.net/viewthread.php?tid=4678&pid=30213&page=1&extra=page%3D1[/url] 今天看到这问题
小弟以前也想过
我的想法很简单~~
一般的硬碟机理,一定会有 System Volume Information 文件夹
因此只要侦测,磁盘里有没有 System Volume Information
就能判断为硬碟还是随身碟[code]@ECHO OFF
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: (
if not exist "%%i:\System Volume Information" (echo %%i is USB)))
PAUSE[/code]
PS 随身碟 = U盘 (台湾用语)
[[i] 本帖最后由 strong12345 于 2009-7-1 12:51 编辑 [/i]] 发一个很久以前写的代码:[code]@echo off
::foxjl@bbs.bathome.net
setlocal enabledelayedexpansion
for /f "delims=\" %%i in ('fsutil fsinfo drives^|find /v ""') do (
set var=%%i
for /f "delims=" %%h in ('fsutil fsinfo drivetype !var:~-2!') do (
echo %%h | find "移动">nul && echo %%i
)
)
pause[/code] 个人认为三个方案都有局限,fsutil和wmic是xp系统的且还要管理员权限,vbscript2000以下用不了,要用还得装组件。
回复 2楼 的帖子
用第一个批,感觉遍历比较管用。。。多u盘的问题可以用eol忽略掉,进行再次遍历查询,效率有点低就是了
[[i] 本帖最后由 dailisishen 于 2009-11-10 21:41 编辑 [/i]]
回复 26楼 的帖子
你有什么好的建议呢? 很强大。。。很好…… 今天要用,搜到了这个帖子,很好很好看了大家的讨论也收获颇丰
楼主的意思很合我的心意,要的就是把盘符赋值到一个变量中供后续调用,只是在屏幕上显示一下的话,没有意义
只不过关于U盘/移动硬盘,被系统识别为“本地硬盘“的情况,似乎确实不好处理
页:
[1]
2