中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]簡化偵測磁碟是否存在程序
作者:
标题: [求助]簡化偵測磁碟是否存在程序 上一主题 | 下一主题
XZ
初级用户





积分 144
发帖 65
注册 2008-3-20
来自 Taiwan
状态 离线
『楼 主』:  [求助]簡化偵測磁碟是否存在程序

狀態: 存在的磁碟機有 C: E: M: 請問如何能簡化以下批次程序
@echo on
set zk=
IF EXIST C: set zk=%zk% c:
IF EXIST d: set zk=%zk% d:
IF EXIST e: set zk=%zk% e:
IF EXIST f: set zk=%zk% f:
IF EXIST g: set zk=%zk% g:
IF EXIST h: set zk=%zk% h:
IF EXIST i: set zk=%zk% i:
IF EXIST j: set zk=%zk% j:
IF EXIST k: set zk=%zk% k:
IF EXIST l: set zk=%zk% l:
IF EXIST m: set zk=%zk% m:
IF EXIST n: set zk=%zk% n:
IF EXIST o: set zk=%zk% o:
IF EXIST p: set zk=%zk% p:
IF EXIST q: set zk=%zk% q:
IF EXIST r: set zk=%zk% r:
IF EXIST s: set zk=%zk% s:
IF EXIST t: set zk=%zk% t:
IF EXIST u: set zk=%zk% u:
IF EXIST v: set zk=%zk% v:
IF EXIST w: set zk=%zk% w:
IF EXIST x: set zk=%zk% x:
IF EXIST y: set zk=%zk% y:
IF EXIST z: set zk=%zk% z:
echo %zk%
pause
結果:
E:\>set zk=

E:\>IF EXIST C: set zk= c:

E:\>IF EXIST d: set zk= c: d:

E:\>IF EXIST e: set zk= c: e:

E:\>IF EXIST f: set zk= c: e: f:

E:\>IF EXIST g: set zk= c: e: g:
.略
.略
.略
E:\>IF EXIST o: set zk= c: e: m: y:

E:\>IF EXIST o: set zk= c: e: m: z:

E:\>echo  c: e: m:
 c: e: m:
我將上面的語法縮減成下面這樣但是 %kkk%都無法帶出數值 最後的結果只會秀出最後一台磁碟機的代號 請協助修正或是支援一下更憂的寫法 謝謝您
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:
for %%d in (%zzk%) do IF EXIST %%d set kkk=%kkk% %%d
echo %kkk%
pause
結果:
E:\>set kkk=

E:\>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:

E:\>for %d in (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 EXIST %d set kkk= %d

E:\>IF EXIST C: set kkk= C:

E:\>IF EXIST D: set kkk= D:

E:\>IF EXIST E: set kkk= E:

E:\>IF EXIST F: set kkk= F:

E:\>IF EXIST G: set kkk= G:
.略
.
.
E:\>IF EXIST Y: set kkk= Y:

E:\>IF EXIST Z: set kkk= Z:

E:\>echo  M:
 M:
[ Last edited by XZ on 2008-3-25 at 12:54 AM ]


2008-3-25 00:52
查看资料  发短消息  网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 2 楼』:  

::windows xp professional fsutil fsinfo drives | more




正在潜水修练的批处理小白
2008-3-25 01:45
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 3 楼』:  

变量延迟: 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




简单!简单!再简单!
2008-3-25 02:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
XZ
初级用户





积分 144
发帖 65
注册 2008-3-20
来自 Taiwan
状态 离线
『第 4 楼』:  

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還可以這樣用喔讓她輸出變成斷行..不過第一行的還是連在一起..不知道她是以怎樣作判斷斷行的 ^^"
C:\>fsutil fsinfo drives

磁碟機: C:\ D:\ E:\ F:\ G:\ H:\ O:\

C:\>fsutil fsinfo drives | more

磁碟機: C:\
D:\
E:\
F:\
G:\
H:\
O:\


2008-3-25 02:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 5 楼』:  

自己运行一下就知道 @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


   此帖被 +3 点积分    点击查看详情   
评分人:【 313885174 分数: +2  时间:2008-3-25 13:02
评分人:【 XZ 分数: +1  时间:2008-3-25 14:33




简单!简单!再简单!
2008-3-25 03:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
313885174
中级用户





积分 206
发帖 100
注册 2007-7-9
状态 离线
『第 6 楼』:  

果然很强


2008-3-25 13:02
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
XZ
初级用户





积分 144
发帖 65
注册 2008-3-20
来自 Taiwan
状态 离线
『第 7 楼』:  

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 不過三種都能達到需求 程序疑問
for /f "skip=1 tokens=1,2 delims=" %%a in ('fsutil fsinfo drives^|find /v ""') do set kkk2=!kkk2! %%a
中間的tokens=1,2 不過我改成 1或是 2 或是1,3結果都一樣..請問這裡設成1,2一定有特別的原因吧^^" 我有K了一下 FOR的說明 ^^"
 skip=n          - 指定在檔案開頭要掠過的
                   行數。
 delims=xxx      - 指定分隔符號的集合。  這會取代
                   預設的空白與定位字元的分隔符號集合。
 tokens=x,y,m-n  - 指定每一行的哪些文字串應該被
                   傳到 for 的內部以用來進行每一個重複操作。
                   這會導致額外的變數名稱被配置。
                   m-n 格式代表一個範圍,
                   指定了第 m 個到第 n 個字串項。
                   如果在 tokens= 字串的最後一個字元是
                   星號,則會配置一個額外的變數
                   來接收最後一個字串項被分析後
                   的其他文字。


2008-3-26 00:28
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:  

在这里 tokens=1,2 可以省略




简单!简单!再简单!
2008-3-26 00:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 9 楼』:  

还有一种NT系列下更通用的方法,其实是VBS代码 www.cn-dos.net/forum/viewthrea ...




2008-3-26 01:45
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
XZ
初级用户





积分 144
发帖 65
注册 2008-3-20
来自 Taiwan
状态 离线
『第 10 楼』:  

感謝各位的解答 問題已解決 忽然發現 第三行指令依然無法達到需求 因為回傳的是 %kkk% 所以正常 要是改成 %kkk2%就無法正確顯示單獨磁碟機代號了 ^^" 執行結果如下
G:\>for /F "skip=1 tokens=1,2 delims=" %a in ('fsutil fsinfo drives|find /v ""'
) do set xz53=!xz53! %a

G:\>set xz53=!xz53! 磁碟機: A:

G:\>set xz53=!xz53! C:

G:\>set xz53=!xz53! D:

G:\>set xz53=!xz53! E:

G:\>set xz53=!xz53! F:

G:\>set xz53=!xz53! G:

G:\>set xz53=!xz53! O:

G:\>echo  磁碟機: A: C: D: E: F: G: O:
 磁碟機: A: C: D: E: F: G: O:
[ Last edited by XZ on 2008-3-26 at 02:11 AM ]


2008-3-26 01:53
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 11 楼』:  

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%




简单!简单!再简单!
2008-3-26 03:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ansipeter
中级用户

替身



积分 269
发帖 130
注册 2007-3-23
状态 离线
『第 12 楼』:  

最终结果不就是得到本地的所有磁盘吗,没有必要用什么变量啊,延迟变量啊之类的,可以试试下面的代码:
@echo off&setlocal
for /f "tokens=1*" %%a in ('fsutil fsinfo drives^|more') do (
for /f %%? in ("%%b %%a") do (
echo %%?
)
)




2008-3-26 10:50
查看资料  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: