中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]再次求解判断盘符问题
作者:
标题: [已解决]再次求解判断盘符问题 上一主题 | 下一主题
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『楼 主』:  [已解决]再次求解判断盘符问题

原来 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 ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-6-2 11:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 2 楼』:  

不用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"




致精致简!
2008-6-2 15:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 3 楼』:  

我在我电脑上执行  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 ]



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-6-2 15:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:  

问题是他有2 个光驱,一个有盘,一个无盘。
要怎么知道他们的盘符?不用fsutil



致精致简!
2008-6-2 15:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 5 楼』:  

跟踪注册表的硬件信息~ 找到关于光驱的项 我想有盘或无盘 键值肯定是不一样的~



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-6-2 15:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 6 楼』:  

26933062 的代码真的是致精致简, 看不太懂但确实执行了正确结果.

但有一个小小的缺陷, 就是忽略了 C 盘.

用我那种办法, 可以用条 ECHO 语句 插入 C 盘 在 光盘之后, 但用你那种办法, 我只能将 C盘 插在第一个或者最后一个, 如何插在中间? 如果增加代码似乎又不合算.

另外我这段程序是在安装系统时调用的, 我想到了有些盘可能没来得及格式化, 会出现 "invalid media", 或者软盘没有插入, 会出现 "Abort? Retry?..." 之类的信息, 不知道

dir %%a: >nul 2>nul

能否屏蔽所有上述信息?  我感觉可能有问题, 我今天回去会测试. 如果无法屏蔽错误信息, 有没有更好的办法?



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-6-2 16:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  

要 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


   此帖被 +2 点积分    点击查看详情   
评分人:【 quya 分数: +2  时间:2008-6-2 16:50




致精致简!
2008-6-2 16:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 8 楼』:  

简矣、妙矣、无以复加矣!

我对楼上的敬佩,有如黄河之水连绵不绝,黄河决堤一发不可收拾。

决定倾我所囊, 贡献我有限的积分. 怎么不能给积分?(说不能给自己) 而且最多给2 ?

[ Last edited by quya on 2008-6-2 at 04:49 PM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-6-2 16:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 9 楼』:  



  Quote:
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 寻找特定盘符的不科学性。

一个好的程序,容错是最重要的, 至于代码的巧妙,那是高人的专利,我等菜鸟无法望其项背, 只好偷偷学几招, 以为窃喜。



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-6-2 21:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: