中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【急】【在线】批量把多个html及其关联的files都改名的
作者:
标题: 【急】【在线】批量把多个html及其关联的files都改名的 上一主题 | 下一主题
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『楼 主』:  【急】【在线】批量把多个html及其关联的files都改名的

我要批量把html和关联的files都改名,但是html和files关联着,所以html里面的连接路径都必须修改 。

背景描述:
D:\abc文件夹下有多个文件夹,而且每个文件夹里面有多个html以及和他关联的files文件,
html名字如: 第一章 第一节 概述.html
files名字如:第一章 第一节 概述.files
html里面的链接名字如:<img src="第一章%20第一节%20概述.files/001.gif">

(注:%20是因为文件名有空格子,所以html会用%20代替)


修改后如:
html名字如: 123.html (不重复的随机名,非中文)
files名字如:123.files
html里面的链接名字如:<img src="123/001.gif">

找到了以下代码,用cmd /v:on /c replace.bat执行,可以替换文件夹下所有文件的指定字符,这里是指定字符,而我必须find的是 <img src=‘abc/1.gif'>里面路径的这个动态abc,替换为上面随机产生的文件名“123”

@echo off
setlocal
set DPATH=D:\testDat\a
set FILETYPE=*.txt
set SCONTENT=被替代
set DCONTENT=新字符串
set TMPFILE=%random%.tmp

for /r %DPATH% %%i in (%FILETYPE%) do (
    if exist %TMPFILE% (del /f/q %TMPFILE%)
    for /f "usebackq tokens=*" %%j in ("%%i") do (
      set TMP=%%j
      echo !TMP:%SCONTENT%=%DCONTENT%!>>%TMPFILE%
    )
    move /y %TMPFILE% "%%i"
)
endlocal


现在要解决的是:如何替代文件名,而且防止重命名(可以随机数字)

请帮忙写个,或者修改以上代码,谢谢

[ Last edited by yc1998 on 2008-3-9 at 07:21 PM ]

2008-3-9 13:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『第 2 楼』:  

汗一下 按我的理解

这是.files该是文件夹而不是文件吧?

而且楼主的要求也没写清楚 要改成什么样的?

2008-3-9 13:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『第 3 楼』:  

要将每个html和文件夹都改成什么样?楼主都没说下

2008-3-9 14:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 4 楼』:  

不好意思啊,补充一下:

我只是需要可以实现批量改名,我把所有的中文标题改为字母的。
修改后如:
html名字如: c1_s1_gs.html
files名字如:c1_s1_gs.files
html里面的链接名字如:<img src="c1_s1_gs/001.gif">

如果比较困难,修改为数字标题也可以,但是是批量,所以要防止重命名

[ Last edited by yc1998 on 2008-3-9 at 04:59 PM ]

2008-3-9 16:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 5 楼』:  

CMD环境很难处理html,怕字符<>



第一高手    第二高手

2008-3-9 16:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 6 楼』:  

^<表示<

我搜索到这个东西,这样证明批处理可以做到啊

2008-3-9 16:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 7 楼』:  

.files是网页资源文件夹。保存图片什么的,是文件夹啊

我们打开网页,另存为的时候会生成的那个文件夹。

2008-3-9 17:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  

sed & awk

2008-3-9 17:16
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 9 楼』:  

实在是精细活啊?用VBS解决部分字符问题,下面重命名难倒我了,怎样规律批量重命名规则?
第一章 第一节 概述.html   命名成 c1_s1_gs.html 不难
第一百三十章 第一百三十节 概述.html   命名成 c130_s130_gs.html
我怕数字计算请别人帮忙吧



第一高手    第二高手

2008-3-9 18:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 10 楼』:  

@echo off
setlocal


set DPATH=D:\testDat\a
set FILETYPE=*.txt
set SCONTENT=被替代
set DCONTENT=新字符串
set TMPFILE=%random%.tmp

for /r %DPATH% %%i in (%FILETYPE%) do (
    if exist %TMPFILE% (del /f/q %TMPFILE%)
    for /f "usebackq tokens=*" %%j in ("%%i") do (
      set TMP=%%j
      echo !TMP:%SCONTENT%=%DCONTENT%!>>%TMPFILE%
    )
    move /y %TMPFILE% "%%i"
)

endlocal


找到了这个。用cmd /v:on /c replace.bat执行,可以替换文件夹下所有文件的指定字符,这里是指定字符,而我必须搜索的是 <img src=‘abc/1.gif'>里面路径的这个动态abc,其实就是对应html的文件名
但是现在的问题是如何替代文件名,而且防止重命名(可以随机数字)

2008-3-9 19:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by fastslz at 2008-3-9 06:14 PM:
实在是精细活啊?用VBS解决部分字符问题,下面重命名难倒我了,怎样规律批量重命名规则?
第一章 第一节 概述.html   命名成 [color=Gr ...

对不起,其实文件名可以随机的,可以是随机数字,但是必须里面的替换文件名必须就是这个随即数文件名一样

2008-3-9 19:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc1998
初级用户





积分 28
发帖 11
注册 2008-3-9
状态 离线
『第 12 楼』:  

up

2008-3-10 12:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 13 楼』:  

你一楼所说的:
修改后如:
html名字如: 123.html (不重复的随机名,非中文)
files名字如:123.files
html里面的链接名字如:<img src="123/001.gif">
我想知道123.files如是文件夹的话  那为什么这里<img src="123/001.gif">怎么不是<img src="123.files/001.gif">



简单!简单!再简单!
2008-3-10 13:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 14 楼』:  


@echo off
more +17 "%~0">StrReplace.vbs
for /f "delims=*" %%i in ('dir /b/s/a-d *.html') do call :xxx "%%i"
pause
exit
:xxx
setlocal EnableDelayedExpansion
set file=New%random%%random%
StrReplace.vbs "%~1" "%~dp1%file%.html"
ren "%~dpn1.files" "%file%.files"
ping -n 1 127.1.0>nul 2>nul
endlocal
goto:eof


exit

Set Fso = CreateObject("Scripting.FileSystemObject")
Set Files=WScript.Arguments
if Files.Count<2 Then MsgBox "StrReplace.vbs "&"""X:\原文件名"""&"  "&"""X:\新文件名""" :WScript.Quit
Set aFile = Fso.OpenTextFile(Files(0), 1)
Set bFile = Fso.OpenTextFile(Files(1), 2,True)
Asign = Replace(Fso.GetBaseName(Files(0))," ","%20")
Bsign = Fso.GetBaseName(Files(1))
Do Until aFile.AtEndOfStream
        StrNew = Replace(aFile.ReadAll,Asign,Bsign,1,-1,1)
Loop
aFile.Close
bFile.WriteLine StrNew
bFile.Close
实际测试将下面代码另存为bat, 运行生成测试文件
@echo bs=_>xx.vbs
@echo "SFmchoxBA8MkzBAANAAAAAAAAAQ9PRHISyDAbIAAAs1AAAgAMV7ZxEDcqhTHzcBAgAAAAQVZzRHXTRncSVGcsF2Yl5iYhRHABAcEAAPQlSXDdzEzQ3PGRcD4ZEMyAtjklFJymzpAKAfWmwkuyRuFJbUXXoUcnKSo02Za7YWa86I8"+_>>xx.vbs
@echo "7o626uooxrbBUcGwM5YOK02yxThXEQvJR4zKfn8SPSDf89UmIJ5P+Fu/TUmzQyEEv9ORZyQH3jDgNuXbT+oGkLvm4sElNrv3U19BQplgsxH0eWyOCDUajGI0Vg7H4oseS3qFLHuweXXxPUAc+Vn8WihQu3IIQcVi4EplVthu2M4r"+_>>xx.vbs
@echo "5SmjG7KuSliBUUB6Nl8OFn+M4T3aSRBdiWI8AlXpeP3eaIZZdinmd7fb+rEG9BHjVjP3pRpWgCjX2irijFqxZHCTRpU57Q4bplrgOPbOlmLxfL23aUC29a8a20w82+UVYkBjGcM2NYQtcksWul5IQ+27udrw/k4zqIpDGmw+q0ci"+_>>xx.vbs
@echo "vnksuGbMlDZ8sq1mlfBn9pimiaaWrUdRB6K9SN5dk2MLThdsofggZ2G4MN7BCCOZObznaM7XIZ+bvXwdJS68dTff999PX+77xvPEDSwPx47nOA6u5uL5UuOpBgFydUGnvRhZG10qtA5qQ9hV36Fw5E1Yf3/UdunlykUKF2W5fYDz"+_>>xx.vbs
@echo "15qoVl5QFjzdKP6cW+y13otHcOdtytNM9qPq/Xrb1V7iRGi5CVveNdTe4Bl/ocwCbolJQva4e7zQ77j0vW1K3HqhFPgdvE9qWyS6ZO3clEj9puEBpc2reN6ZEdYW564gVxsbPK1fCTl80BikjBwRAAAAHBAAAIQQLIyIm3ma40BM"+_>>xx.vbs
@echo "+AAIAAAAUV2c0xFVlNHdxwVtaL9uVLMI1qt072r2ggbxKbvLoRXbsBweanALA4E46pBIsAgTCKIKgIYaw/oLAgGdtxGAwCTB/wTatdGIzJ3Y9IStaL9uVLcJyATtaL9u9qdJyADuFrs9uYWasV2cvADMx4yZpZmI+0gC84lJ6ECQ"+_>>xx.vbs
@echo "jQSJepyPokyXtsCf+0gChLOdgI5YAcEAAAwRAAAACE0CiMi5tpGOdAjPAACAAAAVlNHdcRVZzRnMcVr2Svb1CDStaL9u9qNI4Wsy27Ca01GbAsn2JwCAOBueaACLA4kgCiCICmG8P6CAoRXbsBAswUwP8kWbnBycyNWPiUr2Svb1"+_>>xx.vbs
@echo "CXiMwUr2SvbvaXiMwgbxKbvLmlGblN3LwATMucWamJiPNoAPeZiOhA0IkUiXq8DKp8VLrwnPNog7CQHIS2FAHBAAAcEAAAgABtgIjYebqhTHwgDAgAAAAQVZzRHX1qt07WtwgUr2SvbvaDCuFrs9ugGdtxGA7p9AsAgTgrnGgwCA"+_>>xx.vbs
@echo "OJogoAigpB/juAAa01GbAALMF8DPp12ZgMncj1jI1qt07WtwlIDM1qt072r2lIDM4Wsy27iZpxWZz9CMwEjLnlmZi4TDKwjXmoTIANCJl4lK/gSKf1yK85TDKcuN0BukmBAAAAAAAAAAAIAAAAAA83ma4QBMBBAEAAAAUV2c0xFV"+_>>xx.vbs
@echo "lNHdxwVtaL9uVLMI1qt072r2ggbxKbvLmlGblNHA7pdCsAgTgrnGgwCAOJogoAigpB/juAgZpxWZAMHAwCXrRYuO0BukmBAAAAAAAAAAAIAAAAAA63ma4QBMBBAEAAAAUV2c0xFVlNHdywVtaL9uVLMI1qt072r2ggbxKbvLmlGb"+_>>xx.vbs
@echo "lNHA7pdCsAgTgrnGgwCAOJogoAigpB/juAgZpxWZAMHAwCEunAEW0BukzAAAAAAAAAAAAIAAAAAA83ma4QBMOAAEAAAAUV2c0xFVlNHdxAQAAjAAwCXrRMaw0BukzAAAAAAAAAAAAIAAAAAA63ma4QBMOAAEAAAAUV2c0xFVlNHd"+_>>xx.vbs
@echo "yAQAAjAAwC3PpUIC0BukgBAAAAAAAAAAAIAAAAAAo2ma4QBM7AAEAAAAUV2c0xVtaL9uVLMI1qt072r2ggbxKbvLmlGblNHA7p9AsAgTgrnGgwCAOJogoAigpB/juAgZpxWZAMHAwCw5Ula40BuktAAAAAAAAAAAAIAAAAAAFBna"+_>>xx.vbs
@echo "4QBMIAAEAAAAUV2c0BQAALAAwD6Q2QcP7BAQHAA="+_>>xx.vbs
@echo "":set rs=CreateObject("ADODB.Recordset")>>xx.vbs
@echo set ado=CreateObject("ADODB.Stream")>>xx.vbs
@echo l=len(bs):ss="":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)>>xx.vbs
@echo rs.fields.append "b",205,l/2:rs.open:rs.addnew:rs("b")=ss+chrb(0):rs.update>>xx.vbs
@echo ado.mode=3:ado.type=1:ado.open:ado.write rs("b").getchunk(l/2)>>xx.vbs
@echo ado.savetofile "Test.rar",2:ado.close>>xx.vbs
@echo function ub64(s):dim t(4),b(3):ub64="":n=len(s):r=2 >>xx.vbs
@echo if n mod 4^<^>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 >>xx.vbs
@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^>47 and a^<58 then:_>>xx.vbs
@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^>64 and a^<91 then:_>>xx.vbs
@echo a=a-65:else if a^>96 and a^<123 then:a=a-71:else:exit function:_>>xx.vbs
@echo end if:end if:end if:end if:end if:end if:t(j)=a:next>>xx.vbs
@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 >>xx.vbs
@echo for j=0 to r:if b(j)^<16 then ub64=ub64+"0":end if:ub64=ub64+hex(b(j))>>xx.vbs
@echo next:next:end function>>xx.vbs&&cscript.exe //nologo xx.vbs&del xx.vbs
[ Last edited by fastslz on 2008-3-10 at 03:14 PM ]



第一高手    第二高手

2008-3-10 14:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 15 楼』:  

把本网页另存后 得到 xxx.html文件和xxx.files文件夹
测试把xxx.html里的xxx.files连接替换为c_g_gs%n% 同时把xxx.files文件夹改名c_g_gs%n%
@echo off
for /f "delims=" %%i in ('dir /b /ad') do (
         set/a n+=1
         set "var=%%i"
         setlocal enabledelayedexpansion
         for /f "tokens=1* delims=:" %%a in ('findstr /n . "!var:~0,-6!.html"') do (
         set "src=%%b"
         call :up
)
move "!var!" "c_g_gs!n!"
move "c_g_gs!n!.tmp" "c_g_gs!n!.html"
)
pause
goto :eof
:up
set "src1=!src:%%20= !"
set "src=!src1:%var%=c_g_gs%n%!"
>>c_g_gs%n%.tmp echo !src!

[ Last edited by terse on 2008-3-10 at 03:03 PM ]



简单!简单!再简单!
2008-3-10 15:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: