中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-16 04:51
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何在批处理中使用变量代替盘符!苦恼啊! 查看 1,997 回复 9
楼 主 如何在批处理中使用变量代替盘符!苦恼啊! 发表于 2004-12-10 00:00 ·  中国 辽宁 大连 联通
初级用户
积分 119
发帖 5
注册 2004-12-10 00:00
UID 34508
性别 男
状态 离线
打算做一个脚本提取一些信息,需要自动识别哪个盘符未被占用
例如:
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 ·  中国 广东 广州 联通
中级用户
★★
积分 378
发帖 88
注册 2004-05-05 00:00
UID 23815
性别 男
状态 离线
%%a与&&之间不要有空格。
www.51ct.net
3 发表于 2004-12-11 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re ramjet: 问题在于你的获取盘符后立即跳出的想法未能如你所愿,因为FOR的循环机制不同其它高级语言,慢慢你会发现其它的一些细微差别。 如果想检到第一个空闲盘符,需要将 %alldrive% 的所有盘符全部翻转,而goto start是不需要而且也起不到作用的。但此时仍然排除不了你可能把未放入光盘的光驱盘符误检空闲盘符。 当然用纯dos的方法检测光驱也不是不可以,只是对于你可能过于复杂了些,采用第三方工具对你可能代价也高了些。那么,最简单的方法,还是依照原来的 %alldrive% 顺序检测到最后一个空闲盘,它是光驱的可能性就微乎其微了。 所以,我的建议是:
for %%a in (%alldrive%) do if not exist %%a set drive=%%a
echo "%drive%"
echo OK > %drive%\2K_INFO.txt
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
4 发表于 2004-12-11 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
我写了一个小批处理,但必须运行在2000/xp/2003环境下,并且在运行时要打开cmd.exe的/vn参数(延迟扩充环境变量支持),即使用这个命令行运行:
start /wait cmd.exe /vn /C testdrive.cmd。

由于讨厌的动网论坛不能正常显示我的帖子内容,我只好将批处理放到附件中:
打开附件

偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
5 发表于 2004-12-11 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
@echo off
:: testdrive.cmd 在Windows 2000/xp/2003环境下测试可用的盘符(可以排除无盘光驱)
:: 由于批处理运行时用到了“延迟环境变量扩充的支持”,所以要用下面的命令行来运行这个批处理
:: 运行这个批处理的命令行: start /wait cmd.exe /vn /C testdrive.cmd
setlocal
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 发表于 2004-12-12 00:00 ·  中国 辽宁 大连 联通
初级用户
积分 119
发帖 5
注册 2004-12-10 00:00
UID 34508
性别 男
状态 离线
真是感谢各位,没想到在这GUI的时代还有这么多DOS高手!
7 发表于 2004-12-12 00:00 ·  中国 辽宁 大连 联通
初级用户
积分 119
发帖 5
注册 2004-12-10 00:00
UID 34508
性别 男
状态 离线
以下是引用willsort在2004-12-11 8:35:27的发言:

Re ramjet:
问题在于你的获取盘符后立即跳出的想法未能如你所愿,因为FOR的循环机制不同其它高级语言,慢慢你会发现其它的一些细微差别。
如果想检到第一个空闲盘符,需要将 %alldrive% 的所有盘符全部翻转,而goto start是不需要而且也起不到作用的。但此时仍然排除不了你可能把未放入光盘的光驱盘符误检空闲盘符。
当然用纯dos的方法检测光驱也不是不可以,只是对于你可能过于复杂了些,采用第三方工具对你可能代价也高了些。那么,最简单的方法,还是依照原来的 %alldrive% 顺序检测到最后一个空闲盘,它是光驱的可能性就微乎其微了。
所以,我的建议是:
t

你做过试验了吗?你修改的,最后取到的是G:(我机器上的最后一个光驱),不是z:还得goto start的。
8 发表于 2004-12-13 00:00 ·  中国 广东 广州 联通
中级用户
★★
积分 378
发帖 88
注册 2004-05-05 00:00
UID 23815
性别 男
状态 离线
如果是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%
www.51ct.net
9 发表于 2006-07-15 03:38 ·  中国 江苏 苏州 电信
初级用户
★★
积分 160
发帖 75
注册 2006-06-28 01:07
UID 57661
性别 男
状态 离线
呵呵 似乎很厉害的啊
我收了
10 发表于 2006-07-15 17:36 ·  中国 山西 太原 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
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 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
论坛跳转: