|
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
状态 离线
|
|
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 来自 上海
状态 离线
|
|
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 |
|