中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-08 13:04
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教高手:改文件名 查看 1,264 回复 12
楼 主 请教高手:改文件名 发表于 2008-05-07 18:43 ·  中国 贵州 贵阳 电信
初级用户
积分 31
发帖 16
注册 2008-02-27 19:52
18年会员
UID 111579
性别 男
状态 离线
我这里有几千个TXT文件,其文件名都是数字或者字母组合的,如:89u.txt、fsa.txt、tfsd.txt等,很难从一大堆文件中分清楚到底谁是谁,要是逐个地打开查找费时又费力,这样就给查阅带来了很大的不方便,。如果能将文件内容的前10个字符添替换为文件名,起到索引的作用,找起文件来就方便省事多了。但是文件内容大多开头都有空行,所以我想将搜寻内容定在前3行,长度为10个字符(不分中英文),这样文件名就是以文件内容开头的前10个字符组成的,查阅起来就方便多了,
请高手指教我该怎么写这样一个批处理。。
2 发表于 2008-05-07 19:08 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
但是文件内容大多开头都有空行,所以我想将搜寻内容定在前3行。。。。
----------------------------------------------
这句没看懂~~~
应该举个实例
比如 89u.txt中的内容如下:
-----------start here-----------------


1234567890ajfdlaj
asfdafak;adsf
afdk;lfda
--------cut here--------------------
是不是把89u.txt改成1234567890.txt?
3 发表于 2008-05-07 19:30 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
for是忽略空行的……
4 发表于 2008-05-07 19:44 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
如果真是这样。。。。试下下面的代码吧
@echo off&setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set n=0
for /f "delims=" %%i in (%%a) do (
set/a n+=1
if !n! equ 1 set str=%%i&ren %%a !str:~0,10!.txt
)
)
pause
rem 如果行中有特殊字符会出错。。如果两个文件中的第一行的前10个字符一样,也会出错
5 没测试: 发表于 2008-05-07 21:13 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /s /b *.txt') do (
call :lp %%i
for /f "delims=" %%j in ('dir /s /b *.txt') do if "%%~nj"=="!name!" set name=!name!%random:~,1%
ren "%%~dpnxi" "!name!.txt"
)
echo 改名全部完成!
pause>nul&goto :eof
:lp
for /f "delims=" %%i in (%~dpnx1) do (
set a=%%i
if not "!a:~10!"=="" set name=!a:~,10!&goto :eof
)


[ Last edited by zw19750516 on 2008-5-7 at 10:09 PM ]
批处理之家新域名:www.bathome.net
6 发表于 2008-05-07 21:46 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /s /b *.txt') do (
set "name="
for /f "delims=" %%a in ('type "%%i"') do (
if not defined name set "name=%%a"
)
ren "%%i" "!name:~-10!%%~xi"
)
echo 改名全部完成!
pause>nul
致精致简!
7 发表于 2008-05-08 00:43 ·  中国 贵州 贵阳 电信
初级用户
积分 31
发帖 16
注册 2008-02-27 19:52
18年会员
UID 111579
性别 男
状态 离线
Originally posted by pusofalse at 2008-5-7 07:08 PM:
但是文件内容大多开头都有空行,所以我想将搜寻内容定在前3行。。。。
----------------------------------------------
这句没看懂~~~
应该举个实例
比如 89u ...

对,就是这样
8 发表于 2008-05-08 00:47 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
Originally posted by shanyinwx at 2008-5-8 12:43 AM:

对,就是这样

OK 那就用我那代码吧 但第一行的前十个字符中如果有特殊字符的话,不能保证不会出错
9 发表于 2008-05-08 00:47 ·  中国 贵州 贵阳 电信
初级用户
积分 31
发帖 16
注册 2008-02-27 19:52
18年会员
UID 111579
性别 男
状态 离线
谢谢各位高手。。
10 发表于 2008-05-08 01:03 ·  中国 贵州 贵阳 电信
初级用户
积分 31
发帖 16
注册 2008-02-27 19:52
18年会员
UID 111579
性别 男
状态 离线
但是现在我又发现了一个问题:还有很多的文件内容在开头的几行是相同的,这样就只能命名一个文件,而其他的文件则不能改名,改怎么办,再次请教高手?能不能在这些文件名的后面加个数字或者什么的来区分呢?

[ Last edited by shanyinwx on 2008-5-8 at 01:29 AM ]
11 发表于 2008-05-08 01:34 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
Originally posted by shanyinwx at 2008-5-8 01:03 AM:
但是现在我又发现了一个问题:还有很多的文件内容在开头的几行是相同的,这样就只能命名一个文件,而其他的文件则不能改名,改怎么办,再次请 ...


如果存在重名的,就提取文件中第一行的前11个字符作为文件名,其他的仍是前10个。。。。
@echo off&setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set n=0
for /f "delims=" %%i in (%%a) do (
set/a n+=1
if !n! equ 1 set str=%%i&ren %%a !str:~0,10!.txt>nul 2>nul || ren %%a !str:~0,11!.txt
)
)
pause


[ Last edited by pusofalse on 2008-5-8 at 01:39 AM ]
12 发表于 2008-05-08 01:46 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
那就这样,若有重名文件就在后面加序号。

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b *.txt') do (
set n=0&set "name="
for /f "delims=" %%a in ('type "%%i"') do (
if not defined name set "name=%%a"
)
if exist "!name:~-10!%%~xi" (call :loop "%%i") else (
ren "%%i" "!name:~-10!%%~xi"
)
)
echo 改名全部完成!
pause>nul
exit
:loop
set /a n+=1
if exist "!name:~-10!%n%%~x1" goto loop
ren "%~1" "!name:~-10!%n%%~x1"
goto :eof
致精致简!
13 发表于 2008-05-08 06:48 ·  中国 贵州 贵阳 电信
初级用户
积分 31
发帖 16
注册 2008-02-27 19:52
18年会员
UID 111579
性别 男
状态 离线
非常感谢。。。。。
论坛跳转: