楼 主
一个文件名处理的小问题
发表于 2008-04-01 21:38 · 中国 北京 朝阳区 联通
新手上路
★
积分 4 发帖 1 注册 2008-04-01 21:16 18年会员 UID 114690 性别 男 来自 CN
状态 离线
如何实现下面的功能?
例:
d:\tmp\11_223_321_42.txt
d:\tmp\12_456.txt
读成
11
223
321
42
11
456
第 2 楼
好不容易:
发表于 2008-04-03 18:01 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
楼主的这个小问题好难啊,终于还是搞出来了:
@echo off
for /f "delims=: tokens=1" %%i in ('dir /a-d /b d:\temp ^| findstr /n .*') do (
set str=%%i
set /a str-=1
call :lp %%str%%
)
pause
:lp
set var=skip=%1
if "%var%"=="skip=0" set var=
set n=1
:begin
for /f "%var% delims=_ tokens=%n%" %%i in ('dir /a-d /b d:\temp') do (
set /a n+=1
set b=%%i
setlocal enabledelayedexpansion
set b=!b:.txt=!
echo !b!&goto begin
endlocal
)
echo.&goto :eof
[
Last edited by zw19750516 on 2008-4-3 at 06:04 PM ]
批处理之家新域名:www.bathome.net
第 3 楼
看似好简单的问题,对此问题的一点分析:
发表于 2008-04-03 18:37 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
::::::开始我还真的以为是个简单的问题,就看了一眼再没去想了。今天在论坛闲逛又进了这个帖子,想了一下也许实现起来还真有点问题。于
===================================================================================
是,开始写代码,谁知道越写越觉得有困难,抱着不放弃的念头终于还是写出了能实现的代码,下面就简单地分析一下这个难题:
===================================================================================
首先用dir /a-d /b 列出文件夹下所有的txt文件,接着对各个长文件名进行拆分(这个当然容易,用delims=_就搞定了),然后要逐行提
===================================================================================
取输出拆分文件名的各部分字符串并去除最后一部分字符串中的.txt字符,这就要求在for循环中只能按列去循环提取文件名的各部分字符串
===================================================================================
(也就是在没提取完之前不能跳到下一行也就是下一个文件名)。在这里开启了变量延迟并使用了变量替换set b=!b:.txt=!,同时加入了:
===================================================================================
begin内循环来完成对列的循环。
===================================================================================
最难的问题还是在于完成了列的循环后如何再进入下一行(也就是跳到下一个文件名)来重复列的循环,于是我想到了在前面加入了for循
===================================================================================
环并逐次提取下一行(也就是一个一个文件来)并使用了call反复调用列循环,最终实现了依次对每个名件名各部分字符串的提取。
===================================================================================
最后希望有高手能完善我这段显得繁杂的代码,在此先谢过了。
===================================================================================
[ Last edited by zw19750516 on 2008-4-3 at 06:57 PM ]
批处理之家新域名:www.bathome.net
第 4 楼
发表于 2008-04-03 19:02 · 中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278 发帖 1,020 注册 2007-11-19 13:34 18年会员 UID 103127 性别 男
状态 离线
楼上,想得有点复杂了吧.
假设test.txt内为:
d:\tmp\11_223_321_42.txt
d:\tmp\12_456.txt
@echo off
for /f %%a in (test.txt)do set e=%%~na &call:d %%e:_= %%
pause
:d
if == goto :eof
echo.%1
shift
goto :d
本帖最近评分记录
(共 1 条)
点击查看详情
评分人 分数 时间
bat-zw
+4
2008-04-03 19:24
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具) ~~
空间 ~~
cmd学习
第 5 楼
发表于 2008-04-03 19:22 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
Originally posted by abcd at 2008-4-3 19:05:
@echo off
setlocal enabledelayedexpansion
for /r d:\tmp %%i in (*) do (
set str=%%~ni
set str=!str:_=;!
for %%j in (!str!) do echo %%j
echo.
)
pause>nul
这样不 ...
自己测试吧。。。。。。。。。。。
批处理之家新域名:www.bathome.net
第 6 楼
发表于 2008-04-03 19:28 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
Originally posted by plp626 at 2008-4-3 19:02:
楼上,想得有点复杂了吧.
假设test.txt内为:
d:\tmp\11_223_321_42.txt
d:\tmp\12_456.txt
@echo off
for /f %%a in (test.txt)do set e=%%~na &call:d %%e:_= %%
pause
:d
i ...
shift变量移位确实妙!!!但这段代码对两个文件之间的分隔还是没实现,echo.%1中eho.是无效命令,改为:
@echo off
for /f %%a in (test.txt)do set e=%%~na &call:d %%e:_= %%
pause
:d
if == echo.&goto :eof
echo %1
shift
goto :d
即使这样通用性还是有问题,当文件名分分隔部分超过8个时,如1_1_1_1_1_1_1_1_1_1_1.txt时就会出现问题了。
[
Last edited by zw19750516 on 2008-4-3 at 07:49 PM ]
批处理之家新域名:www.bathome.net
第 7 楼
发表于 2008-04-03 20:00 · 中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212 发帖 2,478 注册 2007-02-08 23:39 19年会员 UID 79003 性别 男
状态 离线
第 8 楼
发表于 2008-04-03 20:05 · 中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268 发帖 879 注册 2006-12-19 16:23 19年会员 UID 73968 性别 男
状态 离线
楼上说超过8个就出问题,不知从何说起。。。
应该是文件名含空格就会出错。
:
@echo off
for /f "delims=" %%i in (test.txt) do call :loop "%%~ni"
pause
:loop
for /f "tokens=1* delims=_" %%a in ("%~1") do (
echo %%a
if not "%%b"=="" call :loop "%%b"
)
goto :eof
致精致简!
第 9 楼
发表于 2008-04-03 20:05 · 中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278 发帖 1,020 注册 2007-11-19 13:34 18年会员 UID 103127 性别 男
状态 离线
Originally posted by zw19750516 at 2008-4-3 07:28 PM:
shift变量移位确实妙!!!但这段代码对两个文件之间的分隔还是没实现,echo.%1中eho.是无效命令,改为:
@echo off
for /f %%a in (test.txt)do set e=%%~n ...
10000个也照样分,你测试.
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具) ~~
空间 ~~
cmd学习
第 10 楼
发表于 2008-04-03 20:08 · 中国 北京 华为云
银牌会员
★★★
积分 1,436 发帖 739 注册 2007-10-11 17:44 18年会员 UID 99469 性别 男
状态 离线
Originally posted by zw19750516 at 2008-4-3 07:22 PM:
自己测试吧。。。。。。。。。。。
你的意思是不行??
第 11 楼
发表于 2008-04-03 22:16 · 中国 江苏 常州 武进区 电信
银牌会员
★★★
积分 2,404 发帖 946 注册 2005-09-08 13:44 20年会员 UID 42345
状态 离线
也发一个
@echo off
for /f "delims=" %%i in (test.txt)do set str=%%~ni&call :lp "%%str:_= %%"
pause
goto :eof
:lp
for %%i in (%~1) do (
echo %%i
)
echo.
简单!简单!再简单!
第 12 楼
发表于 2008-04-04 11:04 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
不再说别的了,顶起诸位了!!!!!!!!!
批处理之家新域名:www.bathome.net
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正