中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 挑战——批量修改后缀名、并同时颠倒文件名
作者:
标题: 挑战——批量修改后缀名、并同时颠倒文件名 上一主题 | 下一主题
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『楼 主』:  挑战——批量修改后缀名、并同时颠倒文件名

挑战——批量修改后缀名、并同时颠倒文件名
   
      批处理的用途是——
      1、把目标文件夹(包含它的所有子目录)里,某类指定后缀名的文件,批量的修改为其它指定的后缀名。
      2、同时,把目标文件夹(包含它的所有子目录)里,某类指定后缀名的文件,批量的颠倒文件名。
      

      补充说明——
      1、批处理必须要支持:由用户在批处理的运行窗口,自行输入目标文件夹(或拖放获取路径)、原后缀名和新后缀名。
      2、目标文件夹的路径,有可能含有空格。
           比如“C:\Documents and Settings\Administrator”目录。
      3、目标文件夹的路径,有可能含有汉字。
            比如“C:\Documents and Settings\Administrator\桌面”目录。
      4、目标文件夹的路径,有可能含有特殊字符。
           比如"^"和“&”字符。
      5、具体改名的例子是:
           比如"1234.原后缀名",改名后就变为“4321.新后缀名”
      6、双后缀名的情况是:
           比如"1234.jpg.原后缀名",改名后就变为“gpj.4321.新后缀名”。
           总之,只认最后一个后缀名为真实后缀名。前面的,全部按文件名处理,整体颠倒!
      7、批处理必须要支持,对系统或隐藏属性文件的改名。但是,改名后,又必须恢复原来的属性。

[ Last edited by lujice on 2011-1-22 at 20:16 ]

2011-1-22 18:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 2 楼』:  一个失败的例子

以下代码,支持子目录、支持路径含特殊字符、支持文件名含特殊字符。不支持颠倒文件名、不支持路径含空格、不支持文件名含空格。
@echo off
:0
cls
echo.
echo.                      ╭────────╮
echo.          ╭─────┤ 使  用  说  明 ├────╮
echo.          │          ╰────────╯        │
echo.          │                                      │
echo.          │   1、本工具的用途是——把指定目录    │
echo.          │      里,某类指定后缀名的文件,批    │
echo.          │      量的修改为其它指定的后缀名。    │
echo.          │                                      │
echo.          │   2、每一步输入完毕,都请敲回车!    │
echo.          │                                      │
echo.          │   3、注意——只输入后缀名,不要      │
echo.          │      输入后缀名前的“.”             │
echo.          │                                      │
echo.          │   4、文件夹的路径中如有空格和特殊    │
echo.          │      字符,请手打输入,不要拖放!    │
echo.          │                                      │
echo.          ╰───────────────────╯
echo.&echo           请输入文件夹的路径,或拖放文件夹到本窗口
set LJ=
set /p LJ=
if /i "%LJ%"=="" goto 0
echo.&echo         请输入修改前的后缀名:
set q=
set /p q=
if /i "%q%"=="" goto 0
echo.&echo          请输入修改后的后缀名:
set h=
set /p h=
if /i "%h%"=="" goto 0
for /r %LJ% %%i in (*.%q%) do ren %%i *.%h%
echo.&echo.           后缀名已批量修改成功!
echo.&echo.           请打开文件夹看看吧!
start %LJ%
pause
goto 0
[ Last edited by lujice on 2011-1-22 at 18:45 ]

2011-1-22 18:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 3 楼』:  好奇怪?怎么又支持空格、特殊字符了?

好奇怪?怎么又支持空格、特殊字符了?

以下例子,语法与上大体相同。但是,它就是要支持空格和特殊字符!

百思不得其解......
@echo off
:hsz
cls
echo.&echo.&echo      请拖放要建立回收站的目录到本窗口!
echo.
set /p mulu=
echo.&echo          请手打输入、或者粘贴输入回收站的名字。
echo.&echo      粘贴的方法是——在批处理的运行窗口点右键。
echo.&echo      如果回收站的名字中,包含空格、特殊字符和汉字,
echo.&echo      则需要在名字的前后加上:英文的双引号—— "
echo.
set /p minzi=
md %mulu%\%minzi%
attrib +s +h %mulu%\%minzi%
(echo [.ShellClassInfo]
echo CLSID={645FF040-5081-101B-9F08-00AA002F954E})>%mulu%\%minzi%\desktop.ini
attrib +s +h %mulu%\%minzi%\desktop.ini
echo.&echo      回收站已建立成功!
echo.&echo      打开看看吧!
echo.
pause
start "" %mulu%
goto (上级菜单的标签号)
[ Last edited by lujice on 2011-1-22 at 19:30 ]

2011-1-22 19:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fsfss
初级用户





积分 22
发帖 20
注册 2009-7-6
状态 离线
『第 4 楼』:  

指定后缀名的文件,批量的颠倒文件名
@echo off
if "%1" equ "" echo.须要参数,例如:%~0 *.txt&exit/b
SET "LOG=\ReDo.BAT"
for %%i in (%*) do (
cd/d "%%~di"
echo.处理:"%%~nxi"
call:reverse "%%~nxi"
)
goto:end

:reverse
echo.CD/D "%~dp1">>"%LOG%"
set "fname=%~1"
set "temp_name=%~1"
set new_name=
:LOOP
set temp_name=%temp_name:~0,-1%
if "%temp_name%" equ "" goto:out
set new_name=%new_name%%temp_name:~-1%
goto:LOOP

:out
echo.REN "%new_name%" "%fname%">>"%LOG%"
ren "%fname%" "%new_name%"
goto:eof

:end
echo.撤消,请运行: "%LOG%" to cancel
pause


2011-1-22 21:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 5 楼』:  

以下,是“批处理之家论坛”“tmplinshi ”老大的代码——
@echo off

:Input_Folder
    echo 请输入文件夹路径(或拖放文件夹到本窗口):
    set Folder=
    set /p Folder=   
   
    if not defined Folder goto Input_Folder
    if not exist "%Folder:"=%" (
        echo * 错误:不存在该文件夹
        goto Input_Folder
    )

:Input_OldExt
    set OldExt=
    set /p OldExt=请输入原后缀名:
   
    if not defined OldExt goto Input_OldExt

:Input_NewExt
    set NewExt=
    set /p NewExt=请输入新后缀名:
   
    if not defined NewExt goto Input_NewExt

rem 去除路径中的引号、后缀中的“.”及前面的字符
set "Folder=%Folder:"=%"
set "OldExt=%OldExt:*.=%"
set "NewExt=%NewExt:*.=%"

for /f "delims=" %%i in ('dir /a:-d /b /s "%Folder%\*.%OldExt%"') do (
    set fPath=%%~dpi
    set fName=%%~ni
    set fAttr=%%~ai
    SetLocal EnableDelayedExpansion
   
    rem 判断有没有“系统”和“隐藏”属性
    set AttrList=
    if "!fAttr:s=!" neq "!fAttr!" set AttrList= s
    if "!fAttr:h=!" neq "!fAttr!" set AttrList=!AttrList! h
    if defined AttrList (
        attrib !AttrList: = -! "!fPath!!fName!.!OldExt!"
    )
   
    rem 计算文件名的字符个数
    set /a n = 8189, b = 0
    for /l %%a in (1 1 13) do (
        set /a "a = (n - b) / 2 + b"
        for %%b in (!a!) do (
            if "!fName:~%%b,1!"=="" (set n=!a!) else set b=!a!
        )
    )
   
    rem 颠倒文件名
    set /a n -= 1
    for /l %%n in (0 1 !n!) do (
        set NewName=!fName:~%%n,1!!NewName!
    )
   
    rem 重命名
    ren "!fPath!!fName!.!OldExt!" "!NewName!.!NewExt!"
   
    rem 如果之前修改了文件属性,则改回去
    if defined AttrList (
        attrib !AttrList: = +! "!fPath!!NewName!.!NewExt!"
    )
   
    EndLocal
)
试验了!目前还没有发现Bug!!

这个工具,用于禁止(恢复)计算机某些功能的执行。比如禁止(恢复)“我的电脑——右键——管理”、比如禁止(恢复)“文件夹选项”、比如禁止(恢复)控制面板的所有项目、比如禁止(恢复)组策略、比如禁止(恢复)注册表......

呵呵!这种禁止方法,别人还能轻易破解吗???

万分感谢tmplinshi 老大!!

马上回去,抱起论坛的教程,慢慢咀嚼tmplinshi 老大的代码......

再次感谢tmplinshi 老大!!

[ Last edited by lujice on 2011-1-23 at 11:05 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 zaixinxiangnian 分数: +1  时间:2011-1-24 00:45


2011-1-23 11:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 6 楼』:  

虽然我是一个不折不扣的菜鸟,只会最简单的命令。但是,我敢于尝试......

过两天,我会发一个U盘病毒免疫批处理。有一点原创的DIY,就是加一个把隐私文件藏进去的功能,再加强下防删除、防更名的能力。

高手就不看了,全是用简单命令写的语句。

回去抠脑壳吧

2011-1-23 11:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
modestleaner
初级用户

beginner



积分 26
发帖 27
注册 2011-1-13
状态 离线
『第 7 楼』:  

关于楼主和那个LZ贴的代码小菜有点不是很懂,望解答
在设置文件路径那段
set lj=
set /p lj=
是可以把使用这个批处理的人拖进来或者输入的路径赋给LJ
但是后面在输入文件的后缀名的时候还是用了
set q=
或者类似的东西,请问难道可以把后缀也拖进去么?



路漫漫其修远兮~
2011-1-23 20:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
glodboy
新手上路





积分 10
发帖 11
注册 2010-12-24
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by modestleaner at 2011-1-23 20:36:
关于楼主和那个LZ贴的代码小菜有点不是很懂,望解答
在设置文件路径那段
set lj=
set /p lj=
是可以把使用这个批处理的人拖进来或者输入的路径赋给 ...

set lj=
rem 设置变量名称
set /p lj=
rem 把获取的值赋给lj

个人理解,错误的地方请指正。

2011-1-24 12:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 9 楼』:  菜鸟对代码的说明



  Quote:
Originally posted by modestleaner at 2011-1-23 20:36:
关于楼主和那个LZ贴的代码小菜有点不是很懂,望解答
在设置文件路径那段
set lj=
set /p lj=
是可以把使用这个批处理的人拖进来或者输入的路径赋给 ...

首先申明,我也是个很菜很菜的菜鸟,就连for语句都不怎么懂。共同学习吧!

@echo off(不显示执行命令)
:hsz(本段标签号)
echo.&echo.&echo      请拖放要建立回收站的目录到本窗口!
echo.
set /p mulu=(给变量%mulu%赋值,支持手打输入或拖放)
echo.&echo          请手打输入、或者粘贴输入回收站的名字。
echo.&echo      粘贴的方法是——在批处理的运行窗口点右键。
echo.&echo      如果回收站的名字中,包含空格、特殊字符和汉字,
echo.&echo      则需要在名字的前后加上:英文的双引号—— "
echo.
set /p minzi==(手打输入给变量%minzi%赋值)
md %mulu%\%minzi%(在指定目录下建立指定名字的文件夹)
attrib +s +h %mulu%\%minzi%(更改它的属性为系统、隐藏)
(echo [.ShellClassInfo]
echo CLSID={645FF040-5081-101B-9F08-00AA002F954E})>%mulu%\%minzi%\desktop.ini(把括号内的字符写入目标文件夹下的“desktop.ini”文件)
attrib +s +h %mulu%\%minzi%\desktop.ini(更改“desktop.ini”文件的属性为系统、隐藏)
echo.&echo      回收站已建立成功!
echo.&echo      打开看看吧!
echo.
pause(暂停)
start "" %mulu%(打开建立回收站的目录)
goto (上级菜单的标签号)

[ Last edited by lujice on 2011-1-24 at 15:47 ]

2011-1-24 15:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
modestleaner
初级用户

beginner



积分 26
发帖 27
注册 2011-1-13
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by glodboy at 2011-1-24 12:09:


set lj=
rem 设置变量名称
set /p lj=
rem 把获取的值赋给lj

个人理解,错误的地方请指正。

首先感谢楼上各位的解答,不过恐怕兄台这里理解错了
/p 的作用是允许变量数值设成用户的一行输入。
那个在制定文件夹下建立回收站的倒是看懂了,没懂的还是那句。



路漫漫其修远兮~
2011-1-24 18:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by modestleaner at 2011-1-23 20:36:
关于楼主和那个LZ贴的代码小菜有点不是很懂,望解答
在设置文件路径那段
set lj=
set /p lj=
是可以把使用这个批处理的人拖进来或者输入的路径赋给 ...

后缀不能拖进去。把文件拖进去后,显示的是包含文件名的完整路径。除非,你再用退格键,删除多余的字符只留下后缀名。但是这样做,和手打输入后缀名有何区别?

[ Last edited by lujice on 2011-1-24 at 19:49 ]

2011-1-24 19:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lujice
新手上路





积分 12
发帖 13
注册 2010-3-3
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by modestleaner at 2011-1-23 20:36:
关于楼主和那个LZ贴的代码小菜有点不是很懂,望解答
在设置文件路径那段
set lj=
set /p lj=
是可以把使用这个批处理的人拖进来或者输入的路径赋给 ...

后缀不能拖进去。把文件拖进去后,显示的是包含文件名的完整路径。除非,你再用退格键,删除多余的字符只留下后缀名。但是这样做,和手打输入后缀名有何区别?

2011-1-24 19:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
modestleaner
初级用户

beginner



积分 26
发帖 27
注册 2011-1-13
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by lujice at 2011-1-24 19:48:



后缀不能拖进去。把文件拖进去后,显示的是包含文件名的完整路径。除非,你再用退格键,删除多余的字符只留下后缀名。但是这样做,和手打输入后缀名有何区别?

嗯,我知道问价后缀名不能拖进去。我的意思是那么那句话不是多余的么?
既然后缀不能拖进去,只有靠手输入的话。



路漫漫其修远兮~
2011-1-25 00:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: