中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何在批处理中使用变量代替盘符!苦恼啊!
作者:
标题: 如何在批处理中使用变量代替盘符!苦恼啊! 上一主题 | 下一主题
ramjet
初级用户




积分 119
发帖 5
注册 2004-12-10
状态 离线
『楼 主』:  如何在批处理中使用变量代替盘符!苦恼啊!

打算做一个脚本提取一些信息,需要自动识别哪个盘符未被占用
例如:
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:后有个空格,命令不能成功运行!
如果去掉这个字符!请各位高手执教!

2004-12-10 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
死性不改
中级用户




积分 378
发帖 88
注册 2004-5-5
状态 离线
『第 2 楼』:  

%%a与&&之间不要有空格。



www.51ct.net
2004-12-10 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

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

  Quote:
for %%a in (%alldrive%) do if not exist %%a set drive=%%a
echo "%drive%"
echo OK >   %drive%\2K_INFO.txt





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-12-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 4 楼』:  

我写了一个小批处理,但必须运行在2000/xp/2003环境下,并且在运行时要打开cmd.exe的/vn参数(延迟扩充环境变量支持),即使用这个命令行运行:
start /wait cmd.exe /vn /C testdrive.cmd。

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

[此贴子已经被作者于2004-12-11 12:05:47编辑过]






偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-11 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

@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



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-11 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
ramjet
初级用户




积分 119
发帖 5
注册 2004-12-10
状态 离线
『第 6 楼』:  

真是感谢各位,没想到在这GUI的时代还有这么多DOS高手!

2004-12-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ramjet
初级用户




积分 119
发帖 5
注册 2004-12-10
状态 离线
『第 7 楼』:  



  Quote:
以下是引用willsort在2004-12-11 8:35:27的发言:

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

你做过试验了吗?你修改的,最后取到的是G:(我机器上的最后一个光驱),不是z:还得goto start的。

2004-12-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
死性不改
中级用户




积分 378
发帖 88
注册 2004-5-5
状态 离线
『第 8 楼』:  

如果是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%

[此贴子已经被作者于2004-12-13 11:34:53编辑过]






www.51ct.net
2004-12-13 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
buddiyar
初级用户





积分 160
发帖 75
注册 2006-6-28
状态 离线
『第 9 楼』:  

呵呵 似乎很厉害的啊
我收了

2006-7-15 03:38
查看资料  发送邮件  发短消息 网志  OICQ (243589543)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 10 楼』:  

Re buddiyar:

      难得兄有心将多年前的旧主题翻出来晾晒,连带几位老兄弟也有重见天日的机会。因为ramjet兄在7楼留了个“尾巴”,当初被我大意的忽略了,现在朝花夕拾,别有一般滋味。

      首先,因为04年底的我,无论从物质上还是精神上,都毫无疑问的是“纯粹的DOS”的粉丝,所以会对“&& goto start”等NTCMD语法如同陌路。所以,才会在众多NTCMD方案中独举纯DOS大旗。

      其次,回答ramjet兄在7楼的疑问:当时我是做了测试的,但是受于环境所限,只是作了MS-DOS7.10和Win98Command环境下的测试,确实可以取到盘符Z:,即使系统中存在未准备好的光驱盘符。现在,又在CMD@WinXP作了简单的测试[1],结果仍然取到了盘符Z:。遗憾的是,这场对话跨越了数千公里和数千小时的时空,ramjet兄也从此杳无音信,我们已经很难再还原当时的问题原貌了。

      最后,仍然需要提醒后来人的是,我的方案是最简单的代码,但不是最健壮的代码,因为它不会将未准备好的光驱盘符认作被占用的盘符。也就是说,如果你的系统中,如果恰好存在一个盘符位Z:的光驱,且没有放入光盘,则你仍然会得到值为Z:的空闲盘符变量%drive%。当然,为了兼容性和简洁性的考量,我将这一较少出现的缺陷有意的忽略了。不忽略的方案也存在,cmd环境下大家可以参考5楼和8楼的方案,其他环境下的方案请参考[2]。

[1]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:

[2]关于 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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-7-15 17:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: