中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何快速进入另一驱动器的相同子目录?
作者:
标题: [已结]如何快速进入另一驱动器的相同子目录? 上一主题 | 下一主题
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『楼 主』:  [已结]如何快速进入另一驱动器的相同子目录?

时常改动一些图形数据文件,并保证网络服务器数据的同步更新,为方便及时的访问网络驱动器的指定目录,想用批处理实现,需要大家的帮助!(其实本地文件夹的右键已经加入了DOS快速通道,能很方便的访问,因为要在DOS下使用ARJ,一直都用ARJ压缩,习惯了,HOHO)问题情况如下:
本地机的目录结构(很多,举了两个例子)
d:\user\1\abcd\0812
d:\user\2\eeffg\0812
网络驱动器目录
h:\th\user\1\eeffg\0812
h:\th\user\3\abcd\0812
假如我现在处于d:\user\1\abcd\0812中,(dos状态),想快速地进入到h:\th\user\3\abcd\0812下,请教如何解决?当然,此时的文件夹3是假设,有可能是1,或2

下边是我自己现学现用弄的,感觉能实现功能,但觉得有缺点,希望大家指点!
我机器的环境(XPsp2)
@echo off
I:
cd\
d:
for /f "tokens=4 delims=\" %%i in ('cd') do dir/s/b I:%%i>c:\windows\temp\billowls.txt
for /f "delims=" %%a in (c:\windows\temp\billowls.txt) do (
for /f "tokens=5 delims=\" %%i in ('cd') do (
echo %%a\%%i
)
)>c:\windows\temp\billowls.txt
for /f "delims=" %%a in (c:\windows\temp\billowls.txt) do cd /D %%a
[ Last edited by HAT on 2008-12-6 at 19:59 ]

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





积分 131
发帖 119
注册 2007-6-12
来自 gz
状态 离线
『第 2 楼』:  

@echo off
:ag
setlocal enabledelayedexpansion
for %%a in (d h) do (for /f "delims=" %%i in ('dir /b/s %%a:0812') do (set /a n+=1
call set w%%n%%=%%i
call echo %%n%%        %%i))
set /p y=输入行号打开
call start "" "%%w!y!%%"
goto ag

[ Last edited by sea1112 on 2008-11-30 at 15:58 ]

2008-11-30 15:34
查看资料  发送邮件  发短消息 网志  OICQ (24278528)  编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 3 楼』:  

感谢楼上的朋友,但似乎还没有真正明白我的意思,或许怪我,没有认真说清楚,其实d:\user\1或d:\user\2目录下,不止我给出的两个文件夹,还有很多的,我要说的是,处于他们下边的文件夹名称都是与I:里的文件夹对应相同的,另外,后面的文件夹是期号,也不仅仅是0812,还有0811,0810,0901,0902等很多的文件夹。转换过程中不需要再输入什么,直接到位。

2008-11-30 20:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sea1112
初级用户





积分 131
发帖 119
注册 2007-6-12
来自 gz
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by czzp2004 at 2008-11-30 08:18 PM:
感谢楼上的朋友,但似乎还没有真正明白我的意思,或许怪我,没有认真说清楚,其实d:\user\1或d:\user\2目录下,不止我给出的两个文件夹,还有很多的 ...

你说的我还是不明白,能说清你的思路吗
你是想做同步多个目录吗?这就用不上日期目录了,日期目录是备份用的吗?

你说“并保证网络服务器数据的同步更新,为方便及时的访问网络驱动器的指定目录”

本机内容=服务器内容

又那来要“及时的访问网络驱动器的指定目录”

做两机文件内容相同,还不如直接用服务器读写,加个时间备份就行了。

[ Last edited by sea1112 on 2008-11-30 at 20:37 ]

2008-11-30 20:31
查看资料  发送邮件  发短消息 网志  OICQ (24278528)  编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:  

把这个批处理放到 %windir% 目录,要切换目录时输入此批处理名字即可:

没有切换过的目录,会全盘扫描一次。如果不想扫描,可以手工把那些互换的路径添加到 %windir%\SameFolder.txt 中。

按以下格式,一行一条:

  Quote:
h:\th\user\1\eeffg\0812=h:\th\user\3\abcd\0812
d:\user\1\abcd\0812=d:\user\2\eeffg\0812
...

(SameFolder.txt 的最后一行一定要留空!)
@echo off
if not exist %windir%\SameFolder.txt goto Scan
for /f "delims== tokens=1,2" %%a in (%windir%\SameFolder.txt) do (
  if /i "%cd%"=="%%a" set "cd2=%%b" & goto cd
  if /i "%cd%"=="%%b" set "cd2=%%a" & goto cd
)

:Scan
set cd1=%cd%
for /f "delims=" %%a in ("%cd%.cndos") do set Folder=%%~na
echo 未切换过文件夹 "%Folder%" ,需要进行一次全盘扫描,请稍等. . .
for %%A 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 %%A: (
    cd /d %%A:\
    for /d /r %%a in ("%Folder%") do (
      if exist "%%a" if /i "%%~dpa%Folder%" neq "%cd%" (
        set "cd2=%%~dpa%Folder%" & goto UpdateTxt
      )
    )
  )
)
echo 未能切换目录,因为没有找到相同的文件夹。& cd /d %cd1% & exit /b

:UpdateTxt
>>%windir%\SameFolder.txt echo %cd1%=%cd2%

:cd
cd /d %cd2%
[ Last edited by tireless on 2008-12-1 at 21:36 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 czzp2004 分数: +1  时间:2008-12-1 19:49


2008-11-30 23:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 6 楼』:  

感谢楼上的朋友,请教两个问题,你的代码中"%cd%.cndos"是什么意思呢,请教!还有,用for命令查找文件快一些呢,还是dir命令快?
测试了一下,发现有问题了。如果在同一盘符中有相同的文件夹名称,就会进入那个文件夹,而不是网络驱动器的文件夹。
比如:在d:\user\1\cbxb\0901时运行,会进入d:\user\1\gk\0901,而不是i:\th\user\2\cbxb\0901
还有好像也有这种可能的,此时在d:\user\1\cbxb\0901时运行,也可能到i:\th\user\1\gk\0901下。(因为此时我把你的代码搜索全部驱动器改成只搜索I盘符)
当然,如果事先在samefolder.txt中已经输入了两个文件夹名称是不会出现这样的情况的!

[ Last edited by czzp2004 on 2008-12-1 at 19:42 ]

2008-12-1 19:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by sea1112 at 2008-11-30 08:31 PM:


你说的我还是不明白,能说清你的思路吗
你是想做同步多个目录吗?这就用不上日期目录了,日期目录是备份用的吗?

你说“并保证网络服务器 ...

感谢你,热心的朋友!

服务器与我们机器的文件是不完全一样的,我们只是把最终的文件要复制到服务器上,等于说修改了文件后,马上就拷贝一份到服务器上。当然,修改嘛还是自己机器上方便,服务器访问太慢了。只是服务器上的路径前半部分与本地机不同,比如:本地机 d:\user\1 服务器可能是 h:\th\user\2,后面的路径都是一样的。就这样的情况!

2008-12-1 19:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 8 楼』:  

1、

  Quote:
代码中"%cd%.cndos"是什么意思

用来获取当前文件夹的名称。

2、

  Quote:
用for命令查找文件快一些呢,还是dir命令快?

我认为是 dir,因为如果 for 中不是用通配符查找,for 会把所有文件(夹)都列出来。

5楼中用 for 是因为处理了特殊情况——如果文件夹在根目录下,dir 盘符:\文件夹 会直接进入那个文件夹,要过滤就比较麻烦。不过你的文件夹不会在盘符根目录下吧?

---------
只在 D 盘与 I 盘切换?

2008-12-1 21:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 9 楼』:  

看这个符合要求不?带参数 /e 运行,是打开 %windir%\SameFolder.txt。
@echo off
if not exist %windir%\SameFolder.txt goto Scan
if "%1"=="/e" start %windir%\SameFolder.txt & exit /b
for /f "delims== tokens=1,2" %%a in (%windir%\SameFolder.txt) do (
  if /i "%cd%"=="%%a" set "cd2=%%b" & goto cd
  if /i "%cd%"=="%%b" set "cd2=%%a" & goto cd
)

:Scan
for /f "delims=" %%a in ("%cd%.cndos") do set Folder=%%~na
for %%D in (D I) do (
  if /i %%~dD neq %%D: (
    echo 未切换过文件夹 "%Folder%" ,需要对 %%D 盘进行一次扫描,请稍等. . .
    for /f "delims=" %%F in ('dir /s /a:d /b "%%D:\%Folder%" 2^>nul') do (
      set "cd2=%%F" & goto UpdateTxt
    )
  )
)
echo 未能切换目录,因为没有找到相同的文件夹。& exit /b

:UpdateTxt
>>%windir%\SameFolder.txt echo %cd%=%cd2%

:cd
cd /d %cd2%


2008-12-1 21:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 10 楼』:  

感谢楼上的朋友(tireless),测试了一下,好像"/e"参数不加也会读取SameFolder.txt文件,另外,还是有这样的问题(现在不会进入到相同盘符的同名目录了。但还是会进入,比如:d:\user\1\aa\0901,会进入到i:\th\user\2\gk\0901。估计代码是测试匹配了0901,不好意思。我这样猜的!其实目录树中,aa,gk等这一级的目录名是唯一的,而在下一级中,还有许多的期数目录。如aa\0901,aa\0809,aa\0810,等。在gk目录中,同样也是gk\0901,gk\0808,gk\0902等。这些0901不是唯一的!

2008-12-2 21:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 11 楼』:  



  Quote:
『第 6 楼』:

如果在同一盘符中有相同的文件夹名称,就会进入那个文件夹,



  Quote:
『第 10 楼』:

现在不会进入到相同盘符的同名目录了

晕了,那到底要不要进入相同盘符的目录?

2008-12-5 00:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 12 楼』:  

我上面所说的相同盘符的同名目录指的是0901一级的。比如,d:\user\1\gk\0901,d:\user\2\cd\0901。不同的文件夹里都有这个0901,我称之为相同。(即名称相同).现在的问题是,有这种情况,比如现在在d:\user\1\gk\0901目录下,执行代码文件后,有可能会进入到 i:\user\2\cd\0901里面,而不是i:\user\2\gk\0901里面。其实在gk这一级的目录,名称都是唯一的,而在他们下一级,都会有0809,0901等一系列的目录!说实话,真的很感谢你了,为了解决问题付出了很多的时间,谢谢了!
其实我需要达到这样的要求:比如我现在处于DOS状态,路径为:d:\user\x(x代表1或2)\gk\0901,执行代码后直接进入到 i:\th\user\y(y代表1,或2,或3)\gk\0901里。现在代码的问题是运行后 进入的可能不是\gk\0901,而是其它目录下的0901.

[ Last edited by czzp2004 on 2008-12-5 at 21:05 ]

2008-12-5 20:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 13 楼』:  看是不是这样


@echo off
set Txt=%windir%\SameFolder.txt
if /i "%1"=="/e" (
  if not exist %Txt% call :CreateTxt
  start %Txt% & exit /b
)
if not exist %Txt% call :CreateTxt & goto Scan

for /f "delims== tokens=1,2" %%a in (%Txt%) do (
  if /i "%cd%"=="%%a" set "cd2=%%b" & goto cd
  if /i "%cd%"=="%%b" set "cd2=%%a" & goto cd
)

:Scan
call :Get..\.
for %%D in (D I) do (
  if /i %%~dD neq %%D: (
    echo 未切换过文件夹 "%Folder%" ,需要对 %%D 盘进行一次扫描,请稍等. . .
    for /f "delims=" %%F in ('dir /s /a:d /b "%%D:\%Up%" 2^>nul') do (
      if exist "%%F\%Folder%" (set "cd2=%%F\%Folder%" & goto UpdateTxt) else goto exit
    )
  )
)
:exit
echo 未能切换目录,因为没有找到相同的文件夹。& exit /b

:CreateTxt
>%Txt% echo ;编辑后,最后一行一定要留为空行!
goto :eof

:Get..\.
for %%a in ("%cd%.cndos") do (
  set Folder=%%~na
  set Up=%%~pa\
)
for %%a in ("%Up:\\=%.cndos") do (
  set Up=%%~na
)
goto :eof

:UpdateTxt
>>%Txt% echo %cd%=%cd2%

:cd
cd /d %cd2%
[ Last edited by tireless on 2008-12-6 at 12:23 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-12-6 19:59


2008-12-5 23:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czzp2004
初级用户





积分 23
发帖 18
注册 2007-11-2
状态 离线
『第 14 楼』:  

感谢你,tireless,现在能达到我的要求了,测试了一下,没有发现什么问题。感谢!另外,对于代码,还想弄明白点,有些问题请教!
(1) %Up:\\=%.cndos 是什么意思呢,.cndos是在什么情况下用呢?
(2) goto :eof  这一句是转向哪里呢?
(3) >>%Txt% echo %cd%=%cd2% 按理说顺序好像反了,应该>>在后面呀,不明白!

2008-12-6 13:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 15 楼』:  

(1)

在 for 中,有这个用法:
%~nI        - 仅将 %I 扩充到一个文件名

所以:
C:\WINDOWS\system32>echo %cd%
C:\WINDOWS\system32

C:\WINDOWS\system32>for %a in ("%cd%.cndos") do @echo 当前文件夹是: %~na
当前文件夹是: system32

.cndos 是本论坛的域名啊 :),只是一个随意的后缀。

%Up:\\=% 把变量 Up 中的 \\ 替换为空,这是 set 的一个用法。

(2)

goto :eof 主要用于结束“子程序”(准确说是“标签”),并且好像只有使用 call 时才有必要使用。例如:
@echo off
call :lable
echo 我回来了
pause
exit /b

:lable
echo 到 lable 标签一游!
goto :eof

echo 命令 call :lable 执行到上面就停止了,这行文字不会被显示。
其他情况 goto :eof 的功能都相当于 exit /b。

(3)

参考:

关于重定向的写法,为什么>file echo abc?
http://www.cn-dos.net/forum/viewthread.php?tid=44488

[ Last edited by tireless on 2008-12-6 at 16:12 ]

2008-12-6 16:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: