标题: 如何在批处理中使用变量代替盘符!苦恼啊!
[打印本页]
作者: ramjet
时间: 2004-12-10 00:00
标题: 如何在批处理中使用变量代替盘符!苦恼啊!
打算做一个脚本提取一些信息,需要自动识别哪个盘符未被占用
例如:
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
%%a与&&之间不要有空格。
作者: willsort
时间: 2004-12-11 00:00
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 |
|
作者: Climbing
时间: 2004-12-11 00:00
我写了一个小批处理,但必须运行在2000/xp/2003环境下,并且在运行时要打开cmd.exe的/v

n参数(延迟扩充环境变量支持),即使用这个命令行运行:
start /wait cmd.exe /v

n /C testdrive.cmd。
由于讨厌的动网论坛不能正常显示我的帖子内容,我只好将批处理放到附件中:
打开附件
[此贴子已经被作者于2004-12-11 12:05:47编辑过]
作者: Climbing
时间: 2004-12-11 00:00
@echo off
:: testdrive.cmd 在Windows 2000/xp/2003环境下测试可用的盘符(可以排除无盘光驱)
:: 由于批处理运行时用到了“延迟环境变量扩充的支持”,所以要用下面的命令行来运行这个批处理
:: 运行这个批处理的命令行: start /wait cmd.exe /v

n /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
作者: ramjet
时间: 2004-12-12 00:00
真是感谢各位,没想到在这GUI的时代还有这么多DOS高手!
作者: ramjet
时间: 2004-12-12 00:00
Quote: |
以下是引用willsort在2004-12-11 8:35:27的发言:
Re ramjet:
问题在于你的获取盘符后立即跳出的想法未能如你所愿,因为FOR的循环机制不同其它高级语言,慢慢你会发现其它的一些细微差别。
如果想检到第一个空闲盘符,需要将 %alldrive% 的所有盘符全部翻转,而goto start是不需要而且也起不到作用的。但此时仍然排除不了你可能把未放入光盘的光驱盘符误检空闲盘符。
当然用纯dos的方法检测光驱也不是不可以,只是对于你可能过于复杂了些,采用第三方工具对你可能代价也高了些。那么,最简单的方法,还是依照原来的 %alldrive% 顺序检测到最后一个空闲盘,它是光驱的可能性就微乎其微了。
所以,我的建议是:
t |
|
你做过试验了吗?你修改的,最后取到的是G:(我机器上的最后一个光驱),不是z:还得goto start的。
作者: 死性不改
时间: 2004-12-13 00:00
如果是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编辑过]
作者: buddiyar
时间: 2006-7-15 03:38
呵呵 似乎很厉害的啊
我收了
作者: willsort
时间: 2006-7-15 17:36
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 ]