![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-23 15:28 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 如何在批处理中使用变量代替盘符!苦恼啊! |
| 可打印版本 2,178 / 9 |
| 第1楼 ramjet | 发表于 2004-12-10 00:00 |
| 初级用户 发帖 5 积分 119 | |
|
如何在批处理中使用变量代替盘符!苦恼啊! 打算做一个脚本提取一些信息,需要自动识别哪个盘符未被占用
例如: for %%a in (%alldrive%) do if not exist %%a set drive=%%a && GOTO START :START echo "%drive%" echo OK > %drive%\2K_INFO.txt 发现显示的是"Z: ",在Z:后有一个空格,这样就变成了Z: \2K_INFO.txt,由于z:后有个空格,命令不能成功运行! 如果去掉这个字符!请各位高手执教! |
|
| 第2楼 死性不改 | 发表于 2004-12-10 00:00 |
| 中级用户 发帖 88 积分 378 | |
|
%%a与&&之间不要有空格。
|
|
| 第3楼 willsort | 发表于 2004-12-11 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re ramjet: 问题在于你的获取盘符后立即跳出的想法未能如你所愿,因为FOR的循环机制不同其它高级语言,慢慢你会发现其它的一些细微差别。 如果想检到第一个空闲盘符,需要将 %alldrive% 的所有盘符全部翻转,而goto start是不需要而且也起不到作用的。但此时仍然排除不了你可能把未放入光盘的光驱盘符误检空闲盘符。 当然用纯dos的方法检测光驱也不是不可以,只是对于你可能过于复杂了些,采用第三方工具对你可能代价也高了些。那么,最简单的方法,还是依照原来的 %alldrive% 顺序检测到最后一个空闲盘,它是光驱的可能性就微乎其微了。 所以,我的建议是:
for %%a in (%alldrive%) do if not exist %%a set drive=%%a |
|
| 第4楼 Climbing | 发表于 2004-12-11 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
我写了一个小批处理,但必须运行在2000/xp/2003环境下,并且在运行时要打开cmd.exe的/v
n参数(延迟扩充环境变量支持),即使用这个命令行运行:start /wait cmd.exe /v n /C testdrive.cmd。由于讨厌的动网论坛不能正常显示我的帖子内容,我只好将批处理放到附件中: 打开附件 |
|
| 第5楼 Climbing | 发表于 2004-12-11 00:00 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
@echo off
:: testdrive.cmd 在Windows 2000/xp/2003环境下测试可用的盘符(可以排除无盘光驱) :: 由于批处理运行时用到了“延迟环境变量扩充的支持”,所以要用下面的命令行来运行这个批处理 :: 运行这个批处理的命令行: start /wait cmd.exe /v n /C testdrive.cmdsetlocal chcp 437 > nul set drives=C: D: E: F: G: H: I: J: K: L: M: N: P: Q: R: S: T: U: V: W: X: Y: Z: set freedrva= for %%d in (%drives%) do @if not exist %%d set freedrva=!freedrva! %%d if not "%freedrva%"=="" echo Suppose Free: %freedrva% && echo =================================set freedrvb= for %%d in (%freedrva%) do @call :_testcd %%d if not "%freedrvb%"=="" echo ================================= && echo Really Free: %freedrvb% && echo. goto _quit:_testcd ::if not "%~1"=="" echo Current test: %~1 if "%~1"=="" goto :eof dir %~1 2> ~ready.txt type ~ready.txt | find /i "ready" > nul if errorlevel 1 set freedrvb=%freedrvb% %~1 ::echo Current Really Free: %freedrvb% goto :eof :_quit del /f /q ~*.* pause chcp 936 > nul |
|
| 第6楼 ramjet | 发表于 2004-12-12 00:00 |
| 初级用户 发帖 5 积分 119 | |
|
真是感谢各位,没想到在这GUI的时代还有这么多DOS高手!
|
|
| 第7楼 ramjet | 发表于 2004-12-12 00:00 |
| 初级用户 发帖 5 积分 119 | |
以下是引用willsort在2004-12-11 8:35:27的发言: 你做过试验了吗?你修改的,最后取到的是G:(我机器上的最后一个光驱),不是z:还得goto start的。 |
|
| 第8楼 死性不改 | 发表于 2004-12-13 00:00 |
| 中级用户 发帖 88 积分 378 | |
|
如果是2000/xp/2003,可以這樣:
@echo off set alldrive= C D E F G H I J K L M N O P Q R S T U V W X Y Z for %%i IN (%alldrive%) DO REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES | FIND "%%i:">nul || set drive=%%i:&& GOTO NEXT :NEXT echo %drive% ======================================== 如果嫌速度不夠快,可以分步執行,避免REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES被多次執行。 @echo off set alldrive= C D E F G H I J K L M N O P Q R S T U V W X Y Z reg export HKLM\SYSTEM\MountedDevices regmd.chk>nul for %%i IN (%alldrive%) do find "%%i:" regmd.chk>nul || set drive=%%i:&& goto next :NEXT del /q regmd.chk echo %drive% |
|
| 第9楼 buddiyar | 发表于 2006-07-15 03:38 |
| 初级用户 发帖 75 积分 160 | |
|
呵呵 似乎很厉害的啊
我收了 |
|
| 第10楼 willsort | 发表于 2006-07-15 17:36 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re buddiyar:
难得兄有心将多年前的旧主题翻出来晾晒,连带几位老兄弟也有重见天日的机会。因为ramjet兄在7楼留了个“尾巴”,当初被我大意的忽略了,现在朝花夕拾,别有一般滋味。 首先,因为04年底的我,无论从物质上还是精神上,都毫无疑问的是“纯粹的DOS”的粉丝,所以会对“&& goto start”等NTCMD语法如同陌路。所以,才会在众多NTCMD方案中独举纯DOS大旗。 其次,回答ramjet兄在7楼的疑问:当时我是做了测试的,但是受于环境所限,只是作了MS-DOS7.10和Win98Command环境下的测试,确实可以取到盘符Z:,即使系统中存在未准备好的光驱盘符。现在,又在CMD@WinXP作了简单的测试,结果仍然取到了盘符Z:。遗憾的是,这场对话跨越了数千公里和数千小时的时空,ramjet兄也从此杳无音信,我们已经很难再还原当时的问题原貌了。 最后,仍然需要提醒后来人的是,我的方案是最简单的代码,但不是最健壮的代码,因为它不会将未准备好的光驱盘符认作被占用的盘符。也就是说,如果你的系统中,如果恰好存在一个盘符位Z:的光驱,且没有放入光盘,则你仍然会得到值为Z:的空闲盘符变量%drive%。当然,为了兼容性和简洁性的考量,我将这一较少出现的缺陷有意的忽略了。不忽略的方案也存在,cmd环境下大家可以参考5楼和8楼的方案,其他环境下的方案请参考。 Test of drives loop for %d in (a b 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 not exist %d: set drive=%d: 关于 HDKP 的几点技术探讨 http://www.cn-dos.net/forum/viewthread.php?tid=12892#pid95281 [ Last edited by willsort on 2006-7-15 at 17:39 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |