中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-07 21:36
48,041 主题排行 / 350,128 发帖 / 今日 3 篇 / 48,252 会员排行
DOS批处理 & 脚本技术(批处理室) » [求助]簡化偵測磁碟是否存在程序
可打印版本  738 / 11
第1楼 XZ 发表于 2008-03-25 00:52
初级用户 发帖 65 积分 144 来自 Taiwan
[求助]簡化偵測磁碟是否存在程序
狀態: 存在的磁碟機有 C: E: M:

請問如何能簡化以下批次程序


結果:


我將上面的語法縮減成下面這樣但是 %kkk%都無法帶出數值
最後的結果只會秀出最後一台磁碟機的代號
請協助修正或是支援一下更憂的寫法 謝謝您


結果:



[ Last edited by XZ on 2008-3-25 at 12:54 AM ]
第2楼 dikex 发表于 2008-03-25 01:45
高级用户 发帖 366 积分 788
::windows xp professional

fsutil fsinfo drives | more
第3楼 terse 发表于 2008-03-25 02:14
银牌会员 发帖 946 积分 2,404
变量延迟:
set kkk=
set zzk=C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:
setlocal enabledelayedexpansion
for %%d in (%zzk%) do IF EXIST %%d set kkk=!kkk! %%d
echo %kkk%
pause

你还有fsutil fsinfo drives....方法
还有 wmic logicaldisk where "drivetype='3'" get caption
第4楼 XZ 发表于 2008-03-25 02:34
初级用户 发帖 65 积分 144 来自 Taiwan
Originally posted by terse at 2008-3-25 02:14 AM:
变量延迟:
set kkk=
set zzk=C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:
setlocal enabledelayedexpansion
for %%d in (%zzk%) do IF EXIST %%d set kkk=!kkk! %%d
echo ...

感謝您 測試結果很OK
兩個小問題
1. 請問為這裡何是使用 "!" 而不是 "%" (這個功能好像要啟動 setlocal enabledelayedexpansion 才會使驚嘆號生效..這個我可以努力找GOOGLE或百度解答)
2.若使用 fsutil fsinfo drives 要如何把輸出的值代進變數中,就是把輸出的值設進 %kkk%


Originally posted by dikex at 2008-3-25 01:45 AM:
::windows xp professional

fsutil fsinfo drives | more

原來MORE還可以這樣用喔讓她輸出變成斷行..不過第一行的還是連在一起..不知道她是以怎樣作判斷斷行的 ^^"
第5楼 terse 发表于 2008-03-25 03:00
银牌会员 发帖 946 积分 2,404
自己运行一下就知道
@echo off
set kkk=
set zzk=C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:
setlocal enabledelayedexpansion
for %%d in (%zzk%) do IF EXIST %%d set kkk=!kkk! %%d
echo %kkk%
pause
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='3'" get caption') do set kkk1=!kkk1! %%a
echo %kkk1%
pause
for /f "skip=1 tokens=1,2 delims=\" %%a in ('fsutil fsinfo drives^|find /v ""') do set kkk2=!kkk2! %%a
echo %kkk%
pause
第6楼 313885174 发表于 2008-03-25 13:02
中级用户 发帖 100 积分 206
果然很强
第7楼 XZ 发表于 2008-03-26 00:28
初级用户 发帖 65 积分 144 来自 Taiwan
Originally posted by terse at 2008-3-25 03:00 AM:
自己运行一下就知道
@echo off
set kkk=
set zzk=C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:
setlocal enabledelayedexpansion
for %%d in (%zzk%) do IF EXIST %% ...

感謝 !!
經過測試第1種執行速度最快
接下來是3,最後是2
不過三種都能達到需求

程序疑問

中間的tokens=1,2 不過我改成 1或是 2 或是1,3結果都一樣..請問這裡設成1,2一定有特別的原因吧^^"


我有K了一下 FOR的說明 ^^"
第8楼 terse 发表于 2008-03-26 00:54
银牌会员 发帖 946 积分 2,404
在这里 tokens=1,2 可以省略
第9楼 fastslz 发表于 2008-03-26 01:45
铂金会员 发帖 2,315 积分 5,493 来自 上海
还有一种NT系列下更通用的方法,其实是VBS代码
http://www.cn-dos.net/forum/viewthread.php?tid=38459
第10楼 XZ 发表于 2008-03-26 01:53
初级用户 发帖 65 积分 144 来自 Taiwan
感謝各位的解答 問題已解決

忽然發現
第三行指令依然無法達到需求
因為回傳的是 %kkk% 所以正常
要是改成 %kkk2%就無法正確顯示單獨磁碟機代號了 ^^"

執行結果如下


[ Last edited by XZ on 2008-3-26 at 02:11 AM ]
第11楼 terse 发表于 2008-03-26 03:33
银牌会员 发帖 946 积分 2,404
Originally posted by XZ at 2008-3-26 01:53:
感謝各位的解答 問題已解決

忽然發現
第三行指令依然無法達到需求
因為回傳的是 %kkk% 所以正常
要是改成 %kkk2%就無法正確顯示單獨磁碟機代號了 ...

for /f "skip=1 delims=\" %%i in ('fsutil fsinfo drives^|find /v ""') do (
set kk2=%%i
set kk2=!kk2:~-2!
set kk1=!kk1! !kk2!
)
echo %kk1%
第12楼 ansipeter 发表于 2008-03-26 10:50
中级用户 发帖 130 积分 269
最终结果不就是得到本地的所有磁盘吗,没有必要用什么变量啊,延迟变量啊之类的,可以试试下面的代码:

[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023