Board logo

标题: [求助]簡化偵測磁碟是否存在程序 [打印本页]

作者: XZ     时间: 2008-3-25 00:52    标题: [求助]簡化偵測磁碟是否存在程序

狀態: 存在的磁碟機有 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 ]
作者: dikex     时间: 2008-3-25 01:45
::windows xp professional

fsutil fsinfo drives | more
作者: terse     时间: 2008-3-25 02:14
变量延迟:
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
作者: XZ     时间: 2008-3-25 02:34


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

作者: terse     时间: 2008-3-25 03:00
自己运行一下就知道
@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
作者: 313885174     时间: 2008-3-25 13:02
果然很强
作者: XZ     时间: 2008-3-26 00:28


  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= 字串的最後一個字元是
                   星號,則會配置一個額外的變數
                   來接收最後一個字串項被分析後
                   的其他文字。

作者: terse     时间: 2008-3-26 00:54
在这里 tokens=1,2 可以省略
作者: fastslz     时间: 2008-3-26 01:45
还有一种NT系列下更通用的方法,其实是VBS代码
http://www.cn-dos.net/forum/viewthread.php?tid=38459
作者: XZ     时间: 2008-3-26 01:53
感謝各位的解答 問題已解決

忽然發現
第三行指令依然無法達到需求
因為回傳的是 %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 ]
作者: terse     时间: 2008-3-26 03:33


  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%
作者: ansipeter     时间: 2008-3-26 10:50
最终结果不就是得到本地的所有磁盘吗,没有必要用什么变量啊,延迟变量啊之类的,可以试试下面的代码:
@echo off&setlocal
for /f "tokens=1*" %%a in ('fsutil fsinfo drives^|more') do (
for /f %%? in ("%%b %%a") do (
echo %%?
)
)