作者: Climbing 时间: 2004-12-11 00:00 @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作者: 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%