中国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 楼』:  



  Quote:
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%

  Quote:
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 楼』:  



  Quote:
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代码
http://www.cn-dos.net/forum/viewthread.php?tid=38459



第一高手    第二高手

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 楼』:  



  Quote:
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 %%?
)
)




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

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


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



论坛跳转: