中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎么获取含有某文件夹所在的分区的盘符?
作者:
标题: 怎么获取含有某文件夹所在的分区的盘符? 上一主题 | 下一主题
gmy
版主

操作系统爱好者


积分 1113
发帖 392
注册 2002-11-11
状态 离线
『楼 主』:  怎么获取含有某文件夹所在的分区的盘符?

子文件夹abc,有可能在c:\,有可能在d:\。。。。。,怎么判断含有abc文件夹的盘符,请使用FOR IN DO 完成。

形如:for...in..do echo %drv%

[ Last edited by gmy on 2009-12-14 at 11:43 ]



DOS之家 http://doshome.com 站长 葛明阳
2009-12-14 11:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mountvol
初级用户





积分 186
发帖 117
注册 2006-8-14
状态 离线
『第 2 楼』:  


@echo off
for %%i in (c d e f) do call :query %%i:
pause

:query
pushd %1
dir /ad /b /s | findstr /irc:"\\abc$"
popd
goto :eof
用wmic可能会简单得多,不过开始运行起来肯定会慢不少。
另外大大你该不会是要的纯DOS下的东东吧.

2009-12-14 12:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 3 楼』:  

for /d  %%i in (abc) do (echo %%~di)

2009-12-14 12:37
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
mountvol
初级用户





积分 186
发帖 117
注册 2006-8-14
状态 离线
『第 4 楼』:  

突然想到一个bug,上面的pushd 是不会回到当前目录的跟目录下的,如果没有特别设置过,那么是无法遍历所有C盘下的文件的,需要pushd c:\,需要把上面的call调用后面加上个\:
@echo off
for %%i in (f e d c) do call :query %%i:\
pause

:query
pushd %1
dir /ad /b /s | findstr /irc:"\\abc$"
popd
goto :eof
另外C盘的文件可能最多,所以把它丢到最后去查,如果要遍历所有的盘符,解决的方案貌似本版有不少。

2009-12-14 16:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gmy
版主

操作系统爱好者


积分 1113
发帖 392
注册 2002-11-11
状态 离线
『第 5 楼』:  

3楼的不对
4楼的太长,能否一行完成?

可能题我没解释清楚,例如:
c:\abc 存在
e:\abc 不存在
e:\abc 不存在
f:\abc 存在
g:\abc 不存在

ECHO的结果应该 f: ,也就是通过搜索获得最后一个存在abc文件夹的盘符,要求一行完成。

命令提示:
for in do 嵌套 for in do 和 if exist

[ Last edited by gmy on 2009-12-15 at 11:00 ]



DOS之家 http://doshome.com 站长 葛明阳
2009-12-15 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mountvol
初级用户





积分 186
发帖 117
注册 2006-8-14
状态 离线
『第 6 楼』:  

这个,如果是根目录,那就太简单了。
如果非根目录,也不难:
@echo off
for %%i in (f e d c) do (pushd %%i:\ & ((dir /ad/b/s 2>nul | findstr /irc:"\\abc$" >nul) && (echo %%i:存在 & pause & goto :eof)))
如果是根目录:
@echo off
for %%i in (f e d c) do pushd %%i:\abc 2>nul && (echo %%i: & pause & goto :eof)


2009-12-15 13:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 7 楼』:  

实在是没明白楼主是什么意思,要不要查询子目录,比如 C:\WINDOWS\abc 这样的算不算???

如果只查根目录的话,

在命令行界面中
cmd /v:on /c ^@echo off ^& (for %i in (c,d,e,f,g) do if exist "%i:\abc\" set vol=%i:) ^& echo !vol!
批处理中
@echo off & setlocal enabledelayedexpansion & (for %%i in (c,d,e,f,g) do if exist "%%i:\abc\" set vol=%%i:) & echo !vol!
pause>nul
[ Last edited by qinchun36 on 2009-12-16 at 17:30 ]



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2009-12-15 14:55
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
mountvol
初级用户





积分 186
发帖 117
注册 2006-8-14
状态 离线
『第 8 楼』:  

用if判断的时候要注意区分文件和目录,不能直接if exist xxx,应该if exist xxx\nul

   此帖被 +2 点积分      点击查看详情   
评分人:【 qinchun36 分数: +2  时间:2009-12-16 17:35


2009-12-15 19:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gmy
版主

操作系统爱好者


积分 1113
发帖 392
注册 2002-11-11
状态 离线
『第 9 楼』:  

我需要带 if exist 的,不要带 pushd 命令的,另外,不需要搜索子目录,只搜索固定的一个 x:\123\abc ,只有盘符x是需要判断的,后面的\123\abc是一串固定的字符串。

[ Last edited by gmy on 2009-12-16 at 16:30 ]



DOS之家 http://doshome.com 站长 葛明阳
2009-12-16 16:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 10 楼』:  

楼主的意思应该是获取全部盘符吧,提供两个方法如下:
@echo off
for /f "skip=2 tokens=1*" %%i in ('fsutil fsinfo drives^|find /v ""') do (
if exist %%i123\abc (set a=%%i)
)
echo %a%
pause

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('wmic logicaldisk get name^|more +1') do (
set x=%%i&set x=!x:~,2!
if exist !x!\123\abc (set a=!x!)
)
echo %a%
pause


2009-12-16 17:19
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 11 楼』:  

老大,你到底要怎样啊啊啊啊啊啊,多谢8楼的指导,我改好了,你试试看说话啊啊啊啊啊

(楼上的也看看 8 楼的提示吧。。。)

[ Last edited by qinchun36 on 2009-12-16 at 17:34 ]



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2009-12-16 17:32
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 12 楼』:  

愚昧了,受教了

2009-12-16 17:59
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 13 楼』:  

葛老大要求一行代码搞定,是不是要用在什么DOS工具里面啊。
如果是的话,for /f、wmic、fsutil之类的,恐怕就不太适用了吧。



2009-12-16 19:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gmy
版主

操作系统爱好者


积分 1113
发帖 392
注册 2002-11-11
状态 离线
『第 14 楼』:  

7楼试过,有效,谢谢qinchun36。

我要的正确答案是:
for %i in (c,d,e,f,g) do if exist %i:\123\abc\nul echo %i

虽然本人身为版主,但并不是什么都会,尤其对FOR命令不感冒,再次谢谢参与讨论的所有会员。



DOS之家 http://doshome.com 站长 葛明阳
2009-12-17 00:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: