Board logo

标题: [已解决]再次求解判断盘符问题 [打印本页]

作者: quya     时间: 2008-6-2 11:52    标题: [已解决]再次求解判断盘符问题
原来 for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do ( %var2% %%a: | find/i /v "cd-rom">>alldrivers.txt 后面少了个括号 根据帖子 http://www.cn-dos.net/forum/viewthread.php?tid=40750&fpage=4 我重新拟了个思路: 我想在所有盘符上寻找一个特定文件, 而且以光盘为优先, 为了避免可恶的错误信息, 我根据这儿网友的思路写了以下代码.
@echo on&setlocal EnableDelayedExpansion
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  %var2% %%a: | find/i "cd-rom">>alldrivers.txt)
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  %var2% %%a: | find/i /v "cd-rom">>alldrivers.txt
for /f "tokens=1 delims=:" %%a in (alldrivers.txt) do (
set "str=%%a"
dir !str!: >nul 2>nul
if !ERRORLEVEL! equ 0 (echo !str!>>readydrivers.txt))
echo.&pause&exit
结果并没有生成 readydrivers.txt 文件 于是我把它再简单化如下
@echo off&setlocal EnableDelayedExpansion
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  %var2% %%a: | find/i "cd-rom">>drivers.txt)
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  %var2% %%a: | find/i /v "cd-rom">>drivers.txt
for /f "tokens=1 delims=:" %%a in (drivers.txt) do (echo %%a)
echo.&pause&exit
for /f "tokens=1 delims=:" %%a in (drivers.txt) do (echo %%a) 还是没执行!! 我于是直接在命令符下执行
for /f "tokens=1 delims=:" %a in (drivers.txt) do (echo %a)
结果准确无误. 这是怎么回事?? 另, 可否代码再简洁点, 比如不生成临时文件之类的. 再另, "fsutil" 只能在 XP PRO环境由管理员身份执行, 如果想避免这种情况. "fsutil fsinfo drives" 可用外部程序 FINDCD (3.11k)代替, "fsutil fsinfo drivetype" 用DRVTYPES (9.09k) 代替, 只需少量修改下. [ Last edited by quya on 2008-6-2 at 12:56 PM ]

作者: 26933062     时间: 2008-6-2 15:21
不用fsutil 判断光驱盘符的方法始终没有想出来。
@echo off&setlocal EnableDelayedExpansion
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  %var2% %%a: | find/i "cd-rom" >nul&&set g=!g! %%a||set "y=!y! %%a"
)
for %%a in (%g% %y%) do (
   dir %%a: >nul 2>nul
   if !ERRORLEVEL! equ 0 (>>readydrivers.txt echo %%a)
)
start "" "readydrivers.txt"

作者: pusofalse     时间: 2008-6-2 15:29
我在我电脑上执行 if not exist g:\ echo succeed 结果成功执行 我的确有G盘,的确是光驱 我想是不是不放入光盘时是不是就“不存在光驱” 用这种方法,不用fsutil也可以了啊~ for %%a in (c d e f g h i j k ... n) do if not exist %%a:\ echo %%a为光驱&goto next :next pause [ Last edited by pusofalse on 2008-6-2 at 03:32 PM ]

作者: 26933062     时间: 2008-6-2 15:33
问题是他有2 个光驱,一个有盘,一个无盘。 要怎么知道他们的盘符?不用fsutil

作者: pusofalse     时间: 2008-6-2 15:50
跟踪注册表的硬件信息~ 找到关于光驱的项 我想有盘或无盘 键值肯定是不一样的~

作者: quya     时间: 2008-6-2 16:30
26933062 的代码真的是致精致简, 看不太懂但确实执行了正确结果. 但有一个小小的缺陷, 就是忽略了 C 盘. 用我那种办法, 可以用条 ECHO 语句 插入 C 盘 在 光盘之后, 但用你那种办法, 我只能将 C盘 插在第一个或者最后一个, 如何插在中间? 如果增加代码似乎又不合算. 另外我这段程序是在安装系统时调用的, 我想到了有些盘可能没来得及格式化, 会出现 "invalid media", 或者软盘没有插入, 会出现 "Abort? Retry?..." 之类的信息, 不知道 dir %%a: >nul 2>nul 能否屏蔽所有上述信息? 我感觉可能有问题, 我今天回去会测试. 如果无法屏蔽错误信息, 有没有更好的办法?

作者: 26933062     时间: 2008-6-2 16:37
要 c 盘
@echo off&setlocal EnableDelayedExpansion
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "tokens=1* delims=:\ " %%a in ('%var1%^|more') do (
  if "%%b"=="" (set str=%%a) else set str=%%b
  set "str=!str:~0,1!"
  %var2% !str!: | find/i "cd-rom" >nul&&set g=!g! !str!||set "y=!y! !str!"
)
for %%a in (%g% %y%) do (
   dir %%a: >nul 2>nul
   if !ERRORLEVEL! equ 0 (echo %%a)
)
pause

作者: quya     时间: 2008-6-2 16:47
简矣、妙矣、无以复加矣! 我对楼上的敬佩,有如黄河之水连绵不绝,黄河决堤一发不可收拾。 决定倾我所囊, 贡献我有限的积分. 怎么不能给积分?(说不能给自己) 而且最多给2 ? [ Last edited by quya on 2008-6-2 at 04:49 PM ]

作者: quya     时间: 2008-6-2 21:00
Originally posted by quya at 2008-6-2 04:30 PM: ......另外我这段程序是在安装系统时调用的, 我想到了有些盘可能没来得及格式化, 会出现 "invalid media", 或者软盘没有插入, 会出现 "Abort? Retry?..." 之类的信息, 不知道 dir %%a: >nul 2>nul 能否屏蔽所有上述信息? 我感觉可能有问题, 我今天回去会测试. 如果无法屏蔽错误信息, 有没有更好的办法? .
报告一下, 在XP DOS 环境下并没有出现我担心的纯DOS下出现的问题。 DIR 一个未格式化的盘或者无盘的软驱,出现错误信息, 但无弹出窗口错误信息。可以 2>nul 屏蔽 if exist ldirver]\nul command, 未格式化盘操作成功,无错误码,无盘软驱则有弹出窗口, 而且无法屏蔽,和无盘光驱类似。 再次证明if exist 寻找特定盘符的不科学性。 一个好的程序,容错是最重要的, 至于代码的巧妙,那是高人的专利,我等菜鸟无法望其项背, 只好偷偷学几招, 以为窃喜。