中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [寻求完善]一个判断光驱的新办法
« [1] [2] »
作者:
标题: [寻求完善]一个判断光驱的新办法 上一主题 | 下一主题
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『楼 主』:  [寻求完善]一个判断光驱的新办法

问题是这样引起的。

看见别人写了个判断 光盘的例子

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\WIN51 set CDROM=%%i

上边的方法很简单, 但有个问题,就是当光驱中没有光盘的时候,会弹出错误信息,然后后边的命令就无法执行, 更糟糕的是, 如果有双光驱, 光盘在第2个光驱的时候, 根本就无法得到结果, 因为第一个光驱读不出, 第2个光驱无法检测。

于是我利用 Dready 这个小程序, 这个小程序用法是 Dready [driver] /w, 返回 errorlevel 0,1,2,255, 如果返回1, 表示是 Readonly, 也就是表示这个是光驱, 并且准备好了。

我改了下程序

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 Dready %%i &if errorlevel 1 echo %%i>>cdrom.txt

我的设想是先检测出可读的光驱到临时文件中,然后再次用 For 命令检测光驱中文件 WIN51, 第2步 很容易编, 问题就出在上边的第一步。

cdrom.txt 文件的结果不是我希望的, 因为errorlevel  的值一直是检测最后一个光驱的值, 我想这就是延迟变量的问题。

于是我在程序中 加入 setlocal ENABLEDELAYEDEXPANSION

并使用 !errorlevel! 代替 %errorlevel %, 但实际发现 !errorlevel!不是一个数值, 而是 !errorlevel!本身

最后我简单编了个 程序如下:

setlocal ENABLEDELAYEDEXPANSION
set test="No problem"
echo !test!

实际运行结果不是 No probelm, 而是 !test!, 这是怎么回事??

我照抄例子的时候是对的, 我自己编却错,而且也不是 !全角半角的问题,这点知识我还是有的。

我为了避免错误, 很多句子是拷贝的, 只是 set=xxx 的自己写, 可是就是错误, 我想不通了。

请大家帮帮我, 谢谢!

[ Last edited by quya on 2008-5-29 at 12:41 PM ]



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





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

把你的完整代码贴出来看看



2008-5-26 19:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

看看这个适合你不。
@echo off
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  for /f "delims=" %%i in ('%var2% %%a: ^| find/i "cd-rom"') do call :loop "%%i"
)
pause&exit
:loop
set num=%~1
set num=%num:~0,1%
if exist %num%:\nul.ext (
   echo.&echo 光盘是 %num% 盘 里面有光盘
) else (
   echo.&echo 光盘是 %num% 盘 无光盘
)
goto :eof
[ Last edited by 26933062 on 2008-5-26 at 07:33 PM ]



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

五星老土


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

3楼的, 你的代码好神奇, 我看不懂, 但功能确实是我需要的。

你代码很复杂, 我想学也无从学起。

估计要你解释,即使你有耐心我也不一定懂。

我只想奢望地问你一下,如果按我思路编, 应该怎么编? 因为我知道我的代码。

谢谢你!!!!

2008-5-26 20:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


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

哈哈, 有点理解你的代码了, 因为 fsutil 居然是个命令。

而且 fsutil fsinfo drivetype [drives] 会显示 “CD-ROM”,“固定驱动器” 之类的东西。

太感谢了, 学了一招!

2008-5-26 20:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


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

好像还是不行,我在第一个光驱中放盘, 第2个光驱无盘。成功显示信息

第2次倒过来,第2个光驱放,第一个光驱不放,就出现弹出信息。

之后又恢复到第1种情况, 还是弹出。

重复N次, 再没成功过。

不解中.......

2008-5-26 20:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 7 楼』:  楼主试试这个:


@echo off
for /f "delims=驱动器:\ " %%i in ('fsutil fsinfo drives^|more') do fsutil fsinfo drivetype %%i: |findstr "CD-ROM">nul&&call :lp %%i
pause>nul&goto :eof
:lp
if exist %1:\autorun.inf (
  echo 光驱%1:中有盘。
) else(
  echo 光驱%1:中无盘。
)
[ Last edited by zw19750516 on 2008-5-26 at 10:14 PM ]



批处理之家新域名:www.bathome.net
2008-5-26 21:22
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





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

:这样呢
@echo off
set "var1=fsutil fsinfo drives"
set "var2=fsutil fsinfo drivetype"
for /f "skip=2 tokens=1 delims=:" %%a in ('%var1%^|more') do (
  for /f "delims=" %%i in ('%var2% %%a: ^| find/i "cd-rom"') do call :loop "%%i"
)
echo.&pause&exit
:loop
set num=%~1&set "str="
set "num=%num:~0,1%"
dir %num%: >nul 2>nul
if %ERRORLEVEL% equ 0 (echo.&echo 光盘是 %num% 盘 里面有光盘) else (
   echo.&echo 光盘是 %num% 盘 无光盘
)
goto :eof
[ Last edited by 26933062 on 2008-5-26 at 10:16 PM ]



致精致简!
2008-5-26 22:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


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

7 楼的程序有错误
8楼的快接近完美了, 可是有点小错。运行结果如下:


光盘是 H 盘 无光盘

光盘是 I 盘 里面有光盘

请按任意键继续. . .

光盘是 ~0,1 盘 无光盘

能把最后一个无效信息去掉就更好,我也正在研究,何处会发生这个小错。

再次感谢!

8楼构思巧妙, 用dir 无光盘光驱只会显示“设备未就绪”(不会弹错误信息), 比那个判断 if exist 文件的句子要强太多!!! 晕! 为什么大家只想到了后者?

[ Last edited by quya on 2008-5-26 at 10:32 PM ]

2008-5-26 22:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

这个错误信息是在  请按任意键继续. . .   之后出现的吗?
如果是,你确定你是完全复制8楼的代码的吗?那后面是有exit的啊!!~~~



致精致简!
2008-5-26 22:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

整理了一下
@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 "str=%%a"
  set "str=!str:~0,1!"
  dir !str!: >nul 2>nul
  if !ERRORLEVEL! equ 0 (echo.&echo 光盘是 !str! 盘 里面有光盘) else (
     echo.&echo 光盘是 !str! 盘 无光盘
)))
echo.&pause&exit


   此帖被 +1 点积分    点击查看详情   
评分人:【 WANKOILZ 分数: +1  时间:2008-5-29 19:33




致精致简!
2008-5-26 22:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


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

我因为要调试, 而且以后要用在批处理,并且还要赋值,所以不能 EXIT

dir >nul 2>nul  那个 2>nul 什么意思? 不写这个, 有信息回显。 我还试了 3>nul , 结果似乎进入一个shell了,只好 EXIT 退出,昏! 从来没看到这样的用法, “26933062” 是强人, 不佩服不行。

2008-5-26 22:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

不能用exit就改为 goto 目标标签,
否则,再显示完后继续运行:loop下面的代码当然就会出现你9楼说的错误情况了。
或者用11楼的就可以了。



致精致简!
2008-5-26 22:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


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

谢谢 26933062, 我之所以要这样一个批处理, 因为我想制作一个 多合一 的XP SP3 安装盘。

目前大多数的多合一盘是有菜单的, 我想做一个无菜单的, 可自动监测机器是否是 OEM机器,如果是,则安装OEM相应版本 (如果光盘上有相应文件), 否则装 VOL版的。

无菜单的好处是可以提高光盘启动的兼容性。

我差不多已经完成了, 其实现在要的程序在实际安装系统的中途是不会把光盘取出来的(但依旧存在双光驱的问题), 但我想可能有人会把我的部分程序拷到硬盘执行,那么就会出现错误信息,我觉得非常不爽, 这才苦思冥想要解决。

今天真是学到东西了!

在实现这个设想的过程中,我用到了一些dos命令,都是用的很笨的命令,但实现的功能在我看起来很复杂。 26933062, 你很强, 我的乱七八糟代码如果你看到恐怕会笑死。

[ Last edited by quya on 2008-5-26 at 11:16 PM ]

2008-5-26 23:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

别客气,大家相互帮助的同时,其实自己也在进步。
你夸我夸的过了,这个论坛里,高手如云,我岂敢妄谈“强”字。
好好看看这里的老帖,你会知道什么才是真正的  强 !



致精致简!
2008-5-26 23:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: