中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 一个文件名处理的小问题 上一主题 | 下一主题
groofy
新手上路





积分 4
发帖 1
注册 2008-4-1
来自 CN
状态 离线
『楼 主』:  一个文件名处理的小问题

如何实现下面的功能?
例:
d:\tmp\11_223_321_42.txt
d:\tmp\12_456.txt
读成
11
223
321
42

11
456

2008-4-1 21:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 2 楼』:  好不容易:

楼主的这个小问题好难啊,终于还是搞出来了:
@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
2008-4-3 18:01
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 3 楼』:  看似好简单的问题,对此问题的一点分析:

::::::开始我还真的以为是个简单的问题,就看了一眼再没去想了。今天在论坛闲逛又进了这个帖子,想了一下也许实现起来还真有点问题。于
===================================================================================
是,开始写代码,谁知道越写越觉得有困难,抱着不放弃的念头终于还是写出了能实现的代码,下面就简单地分析一下这个难题:
===================================================================================
      首先用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
2008-4-3 18:37
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 4 楼』:  

楼上,想得有点复杂了吧.

假设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 [%1]==[] goto :eof
echo.%1
shift
goto :d


   此帖被 +4 点积分        点击查看详情   
评分人:【 bat-zw 分数: +4  时间:2008-4-3 19:24




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-3 19:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  



  Quote:
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
2008-4-3 19:22
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 6 楼』:  



  Quote:
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 [%1]==[] 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
2008-4-3 19:28
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 7 楼』:  

vbs的话replace就搞定了。

2008-4-3 20:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 8 楼』:  

楼上说超过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




致精致简!
2008-4-3 20:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-4-3 07:28 PM:

shift变量移位确实妙!!!但这段代码对两个文件之间的分隔还是没实现,echo.%1中eho.是无效命令,改为:
[code]@echo off
for /f %%a in (test.txt)do set e=%%~n ...

10000个也照样分,你测试.



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-3 20:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-4-3 07:22 PM:

自己测试吧。。。。。。。。。。。

你的意思是不行??

2008-4-3 20:08
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
terse
银牌会员





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

也发一个
@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.



简单!简单!再简单!
2008-4-3 22:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 12 楼』:  

不再说别的了,顶起诸位了!!!!!!!!!



批处理之家新域名:www.bathome.net
2008-4-4 11:04
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复

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


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



论坛跳转: