中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-18 11:02
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助ftp文件遍历问题 查看 1,190 回复 6
楼 主 求助ftp文件遍历问题 发表于 2005-06-12 00:00 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
小弟在win2k下的一个批处理FTP_DIR.bat,内容为
rem ****************son.bat*********************
echo set /a dir_level=dir_level+1>son.bat
echo set /a pth_level=pth_level+1>>son.bat
echo set pth%%pth_level%%=%%pth%%
echo echo open %%1 ^>script.txt>>son.bat
echo echo %%2 ^>^>script.txt>>son.bat
echo echo %%3 ^>^>script.txt>>son.bat
echo echo cd %%pth%% ^>^>script.txt>>son.bat
echo echo dir *.* filelist.txt ^>^>script.txt>>son.bat
echo echo bye ^>^>script.txt>>son.bat
echo ftp -s:script.txt>>son.bat
echo del temp.txt>>son.bat
echo echo %%pth%% ^>^>pth.txt>>son.bat
echo for /f "eol=d tokens=8* delims= " %%%%i in (filelist.txt) do echo %%pth%%/%%%%j ^>^>final.txt>>son.bat
echo for /f "eol=- tokens=8* delims= " %%%%i in (filelist.txt) do echo %%%%j ^>^>temp.txt>>son.bat
echo for /f %%%%i in (temp.txt) do set a=%%%%i>>son.bat
echo if "%%a%%"==".." goto :end>>son.bat
echo for /f "eol=. tokens=1,2 delims= " %%%%i in (temp.txt) do if "%%%%j"=="" echo %%%%i ^>^>%%dir_level%%.txt>>son.bat
echo for /f %%%%i in (%%dir_level%%.txt) do (>>son.bat
echo set pth=%%pth%%/%%%%i>>son.bat
echo call son.bat %%1 %%2 %%3>>son.bat
echo set pth=%%pth(%%pth_level%%)%%>>son.bat
echo )>>son.bat
echo :end>>son.bat
echo del %%dir_level%%.txt>>son.bat
echo set /a dir_level=dir_level-1>>son.bat
echo set /a pth_level=pth_level-1>>son.bat
rem ****************************完****************************
echo open %1>script.txt
echo %2>>script.txt
echo %3>>script.txt
echo dir *.* filelist.txt>>script.txt
echo bye>>script.txt
ftp -s:script.txt
set pth=
set pth_level=0
set dir_level=0
if exist final.txt del final.txt
if exist %dir_level%.txt del %dir_level%.txt
if exist temp.txt del temp.txt
del pth.txt
for /f "eol=d tokens=9 delims= " %%i in (filelist.txt) do echo %%i >>final.txt
for /f "eol=- tokens=9 delims= " %%i in (filelist.txt) do echo %%i >>temp.txt
for /f "eol=." %%i in (temp.txt) do echo %%i >>%dir_level%.txt
for /f %%i in (%dir_level%.txt) do (
set pth=%%i
call son.bat %1 %2 %3
)

son.bat的内容
set /a dir_level=dir_level+1
set /a pth_level=pth_level+1
echo open %1 >script.txt
echo %2 >>script.txt
echo %3 >>script.txt
echo cd %pth% >>script.txt
echo dir *.* filelist.txt >>script.txt
echo bye >>script.txt
ftp -s:script.txt
del temp.txt
echo %pth% >>pth.txt
for /f "eol=d tokens=8* delims= " %%i in (filelist.txt) do echo %pth%/%%j >>final.txt
for /f "eol=- tokens=8* delims= " %%i in (filelist.txt) do echo %%j >>temp.txt
for /f %%i in (temp.txt) do set a=%%i
if "%a%"==".." goto :end
for /f "eol=. tokens=1,2 delims= " %%i in (temp.txt) do if "%%j"=="" echo %%i >>%dir_level%.txt
for /f %%i in (%dir_level%.txt) do (
set pth=%pth%/%%i
call son.bat %1 %2 %3
set pth=%pth(%pth_level%)%
)
:end
del %dir_level%.txt
set /a dir_level=dir_level-1
set /a pth_level=pth_level-1

final.txt是ftp服务器上文件名的存放文件
现在存在几个问题:
1,如果ftp服务器上有个文件夹的名字中有空格时,即ftp>cd my music不能进入my music录 所以用son.bat中的
for /f "eol=. tokens=1,2 delims= " %%i in (temp.txt) do if "%%j"=="" echo %%i >>%dir_level%.txt 过滤。
2,可以遍历部分ftp文件,中间会自动退出
不知道哪里错了,请各位大侠指教
不知道这样说有没有说明白

2 发表于 2005-06-17 00:00 ·  中国 山东 济宁 联通
钻石会员
★★★★★
积分 10,046
发帖 3,039
注册 2002-11-11 00:00
23年会员
UID 223
性别 男
状态 离线
没仔细看,dos 下可以 cd "my music"。
简单就是美
3 发表于 2005-06-18 00:00 ·  中国 广东 广州 电信
金牌会员
★★★★
D◎$ Fαп
积分 4,562
发帖 1,883
注册 2004-01-19 00:00
22年会员
UID 15812
性别 男
来自 广东广州
状态 离线
嗯,对于带有空格的目录名,可以在CD命令后用双引号包住。
----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
4 发表于 2005-06-19 00:00 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
谢了各位先回去再see see
5 发表于 2005-06-28 00:00 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re smileseeker:  关键在于 filelist.txt 的格式,虽然可以从你的 for 语句中窥见端倪,但是最好还是贴出样本为好。另外,不知 ftp 的 dir 是否支持类似 dir /b 的“裸格式”。至于文本的空格问题,倒是可以用 for 为指定的串前后加上引号,但是也不能一概而论,只有见到 filelist.txt 才好做判断。  另外,你使用动态创建 son.bat 来遍历子目录未免让人烟花缭乱,可以考虑以子模块的形式嵌入到程序中,这样可以避免 % ^ 之类的纷扰。-------------------- sample.bat --------------------
:main :: 主程序开始
if "%1"==":" goto %2
:: 主程序语句
call %0 : submodule %1 %2 %3
:: 主程序语句
goto end:submodule :: 子模块开始
:: 子模块中语句
goto end :: 子模块结束:: 主程序语句
:end :: 主程序结束
-------------------- sample.bat --------------------
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
6 发表于 2005-07-08 00:00 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
头晕头晕还是修炼一段时间再来整这个程序吧多谢各位了
7 发表于 2006-09-05 22:13 ·  中国 上海 上海乾万网络(QianWan_Network)有限公司(电信出口)
新手上路
积分 8
发帖 4
注册 2006-09-04 14:24
19年会员
UID 61835
状态 离线
能不能做到对ftp文件的搜索呢
论坛跳转: