|
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 |
|
|
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 |
|
|
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 ]
|
|
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、
用来获取当前文件夹的名称。
2、
我认为是 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 |
|