找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 14759|回复: 15

[其他] [已解决]批处理如何判断指定盘符是不是可移动磁盘?

[复制链接]
发表于 2025-5-9 12:06:30 | 显示全部楼层 |阅读模式
本帖最后由 zhoubin 于 2025-5-11 15:45 编辑
  1. for /f "delims=" %%i in ('call pecmd.exe "Team/ fdrv v=*:/forx * %%v%%,v,team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,set. &u=%%&u%%\n%%v%% %%v1%%/mstr * &u=-1,-2,&u/writ *fv -,,&u"') do @echo %%i
  2. pause
复制代码
找了一段代码,请大佬帮我改一下,判断指定盘符是不是可移动磁盘(比如:i:盘),如果是执行代码1,不是执行代码2,谢谢!!
谢谢aloha20200628、buyiyang及各位的帮助!!

经测试15楼的代码可用,谢谢.....
 楼主| 发表于 2025-5-9 12:10:27 | 显示全部楼层
需要pecmd,传到这里了[url=通过网盘分享的文件:PECMD.EXE 链接: https://pan.baidu.com/s/1FeSzyCIKrOaYYlnLixVDrQ?pwd=yia7 提取码: yia7]pecmd[/url]
发表于 2025-5-9 13:15:00 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-5-9 13:32 编辑

回复 1# zhoubin

如果系统内置了 wmic 功能,可试试以下代码(首行预设盘符为 G: 可自定义)...

  1. @echo off &set "drive_letter=G:"
  2. for /f "tokens=2 delims=#," %%a in (' "wmic logicaldisk where DeviceID='%drive_letter%' assoc /assocclass:Win32_LogicalDiskToPartition" ') do for /f "delims=" %%v in (
  3.    'wmic DiskDrive where "index=%%a" get MediaType') do echo,%%v
  4. pause&exit/b
复制代码
屏显返回值若是 External hard disk media 即为外接硬盘,如指定盘符是外接硬盘则须等候其热连接成功...

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 感谢帮助

查看全部评分

 楼主| 发表于 2025-5-9 14:36:43 | 显示全部楼层
本帖最后由 zhoubin 于 2025-5-9 14:38 编辑

PUSHD %~dp0
set v=i:
@echo off
for /f "delims=" %%i in ('call pecmd.exe "Team/ fdrv v=*:/forx * %%v%%,v,team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,set. &u=%%&u%%\n%%v%% %%v1%%/mstr * &u=-1,-2,&u/writ *fv -,,&u"') do (
@echo.
@echo %%i
set %%i=可移动磁盘
)
@echo on
如果是可移动磁盘 goto Udisk
如果不是可移动磁盘 goto Hdisk

pause&&exit

:Udisk
echo 移动磁盘
pause&&goto :eof

:Hdisk
echo 本地磁盘
pause&&goto :eof

楼上的这个脚本,PE下用不了,谢谢了!
上面的脚本是我瞎改的,不会呀
红色标注的地方我不会写,请教了,谢谢!!
发表于 2025-5-9 15:20:11 | 显示全部楼层
回复 4# zhoubin

手边没有 PE 系统无法验证4楼代码... 你能告知如果是移动硬盘,echo %%i 的返回值为何?
 楼主| 发表于 2025-5-9 15:57:47 | 显示全部楼层
在正常系统win11下测试了一下,echo %%i 的返回值是i: 1

PUSHD %~dp0
set v=i:
@echo off
for /f "delims=" %%i in ('call pecmd.exe "Team/ fdrv v=*:/forx * %%v%%,v,team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,set. &u=%%&u%%\n%%v%% %%v1%%/mstr * &u=-1,-2,&u/writ *fv -,,&u"') do (
@echo.
@echo %%i
set %%i=可移动磁盘
)
@echo on
if defined %%i goto Udisk
if not defined %%i goto Hdisk
pause&&exit

:Udisk
echo 移动磁盘
pause&&goto :eof

:Hdisk
echo 本地磁盘
pause&&goto :eof
又改了一下批处理,标红的地方,没有到:Udisk标签段,谢谢,麻烦了
发表于 2025-5-9 16:14:35 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-5-9 16:48 编辑

回复 6# zhoubin

据此4楼代码可简化如下...

  1. @echo off &set "v=i:"
  2. for /f "delims=" %%i in (
  3.    'call pecmd.exe "Team/ fdrv v=*:/forx * %%v%%,v,team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,set. &u=%%&u%%\n%%v%% %%v1%%/mstr * &u=-1,-2,&u/writ *fv -,,&u" '
  4. ) do if "%%i"=="1" (goto :Udisk) else (goto :Hdisk)
  5. :Udisk
  6. echo,移动磁盘
  7. pause&exit/b
  8. :Hdisk
  9. echo,本地磁盘
  10. pause&exit/b
复制代码
另问》你的 PE 系统能运行 powershell 吗?

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 谢谢帮助!!

查看全部评分

 楼主| 发表于 2025-5-9 16:21:55 | 显示全部楼层
回复 7# aloha20200628
echo %%i 的返回值是
  1. i: 1
复制代码
,不好意思,我没讲清楚,运行楼上的代码还是没有到:Udisk标签段,PE 系统没有 powershell,谢谢您!!
 楼主| 发表于 2025-5-9 16:46:00 | 显示全部楼层
@echo off &PUSHD %~dp0&set "v=i:"
for /f "delims=" %%i in (
   'call pecmd.exe "Team/ fdrv v=*:/forx * %%v%%,v,team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,set. &u=%%&u%%\n%%v%% %%v1%%/mstr * &u=-1,-2,&u/writ *fv -,,&u" '
) do if "%%i"=="i: 1" (echo,移动硬盘) else (echo,本地硬盘)
pause&exit/b
把您的代码,修改了一下,标红的地方是移动磁盘盘符,可以了,谢谢您的热心帮助!!
发表于 2025-5-9 16:52:53 | 显示全部楼层
回复 8# zhoubin

7楼代码已修改,跳出循环直达相应标号...
 楼主| 发表于 2025-5-9 17:13:35 | 显示全部楼层
回复 10# aloha20200628

谢谢,运行7楼代码没有达相应标号(移动磁盘)处...
9楼改自您的代码,可以到达相应标号(移动磁盘)处
  1. if "%%i"=="1" (goto :Udisk)
复制代码
,这个条件不成立
  1. if "%%i"=="i: 1" (goto :Udisk)
复制代码
,这个条件是成立的!!
发表于 2025-5-9 17:58:45 | 显示全部楼层
回复 11# zhoubin

%%i 的返回值若为 i: 1,则其中的 i: 应为代码首行设定的 %v% 盘符变量值,如是,7楼代码第4行中的 if "%%i"=="1" 须改为 if "%%i"=="%v% 1" 请楼主验证...
 楼主| 发表于 2025-5-9 18:22:01 | 显示全部楼层
改为
  1. if "%%i"=="%v% 1"
复制代码
后,代码闪退,看来还是有问题,抽时间了再验证....
发表于 2025-5-9 19:23:48 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-5-9 19:30 编辑

回复 13# zhoubin

将 9 楼代码中的

   do if "%%i"=="i: 1" (echo,移动硬盘) else (echo,本地硬盘)
改为
   do echo,%%i&echo,%v%&pause&if "%%i"=="%v% 1" (echo,移动硬盘) else (echo,本地硬盘)

再测试每次用不同盘符赋值 %v% 时在断点处暂停屏显出 %%i 和 %v% 的实值变化,据此即可验明真相了...
发表于 2025-5-9 20:17:33 | 显示全部楼层
  1. @echo off
  2. set "v=i:"
  3. for /f "delims=" %%i in ('call pecmd.exe "team part list drv %%v%%,v1|ifex '%%v1%%'='',!team@ mstr * v1=<-1>v1@part list disk %%v1%%,v2@mstr * v2=<-3>v2@ifex $%%v2%%=7,writ *fv -,,v1"') do set "mark=%%i"
  4. if defined mark (echo,yes) else (echo,no)
  5. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 感谢帮助

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:12 , Processed in 0.021898 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表