Board logo

标题: [文本处理] [已解决]批处理截取字符输出到文件时为何出错? [打印本页]

作者: 珠七七    时间: 2011-10-15 06:47     标题: [已解决]批处理截取字符输出到文件时为何出错?

本帖最后由 珠七七 于 2011-10-17 15:02 编辑

首先附上内容
time.txt
  1. 4:52:00
  2. 4:53:00
  3. 4:54:00
  4. 4:55:00
复制代码
1.bat
  1. for /f "delims=: tokens=1,2" %%i IN (time.txt) do echo 0%%i%%j>timey.txt
复制代码
看教程说生成的timey.txt应该是
  1. 0452
  2. 0453
  3. 0454
  4. 0455
复制代码
可是得到的内容却是:0455.是代码有问题吗?请大家指教一下.


以上问题已解决,非常感谢大家的帮助,特别是11楼的 awk ,谢谢!下面是追加问题.
首先我有两个文件name.txt和time.txt
name.txt,内容如下:
  1. 1.aa
  2. 2.bb
  3. 4.cc
  4. 5.dd
  5. 6.ee
复制代码
time.txt.内容如下:
  1. 4:52:00
  2. 4:53:00
  3. 4:54:00
  4. 4:55:00
  5. 4:56:00
复制代码
我的要求是另外把1.txt,2.txt,4.txt,5.txt..
重命名为:
name.txt所截取第一行的内容_当前年月日_time.txt所截取第一行的时间.txt(结果:1.aa_20111015_0452.txt)
name.txt所截取第二行的内容_当前年月日_time.txt所截取第二行的时间.txt(结果:2.bb_20111015_0453.txt)
没有3.txt文件
name.txt所截取第三行的内容_当前年月日_time.txt所截取第二行的时间.txt(结果:4.cc_20111015_0454.txt)
name.txt所截取第四行的内容_当前年月日_time.txt所截取第二行的时间.txt(结果:5.dd_20111015_0455.txt)
没有第三份txt文件的,其他的都有.这样的话应该怎么样呢?
作者: weichenxiehou    时间: 2011-10-15 08:10

回复 1# 珠七七
楼主得弄清楚“>”的含义,“>”为重定向符号,且会覆盖原文件内容,把“>”改为“>>”就行了,“>>”表示追加,并不覆盖原内容。
作者: guaiwu    时间: 2011-10-15 12:36

  1. @echo off
  2. (for /f "delims=: tokens=1,2" %%i IN (time.txt) do echo 0%%i%%j)>timey.txt
复制代码

作者: 珠七七    时间: 2011-10-15 12:41

嗯嗯,谢谢,我知道了.
作者: 珠七七    时间: 2011-10-15 13:32

再想请教一下,上述time.txt中,提取到需要的字符后,总共有4行.
  1. @echo off
  2. for /F "tokens=1,2,3 delims=- " %%i in ('date /T') do set D=%%i%%j%%k
  3. FOR /F "tokens=1,2 delims=:" %%i IN (time.txt) do set T=0%%i%%j
  4. echo 当前日期为:%d%
  5. echo 当前时间为:%t%
  6. echo 如果正确请按任意键,如果不对请关闭窗口.
  7. pause
  8. ren "1.txt" "1.aa_%d%_%t%.txt"
  9. ren "2.txt" "2.bb_%d%_%t%.txt"
  10. ren "4.txt" "4.cc_%d%_%t%.txt"
  11. ren "5.txt" "5.dd_%d%_%t%.txt"
复制代码
重命名后得出的结果是:
1.aa_20111015_0452.txt
2.bb_20111015_0453.txt
3.cc_20111015_0454.txt
4.dd_20111015_0455.txt
上面的代码应该要怎样补充呢?
作者: CrLf    时间: 2011-10-15 16:33

回复 5# 珠七七


    不明白你的意思是补充什么内容呢?
作者: awk    时间: 2011-10-15 17:52

回复 5# 珠七七
  1. @echo off
  2. set D=%date:~0,10%
  3. set D=%D:-=%
  4. set T=%time:~0,5%
  5. set T=%T::=%
  6. set T=%T: =0%
  7. echo 当前日期为:%d%
  8. echo 当前时间为:%t%
  9. echo 如果正确请按任意键,如果不对请关闭窗口.
  10. pause
  11. ren "1.txt" "1.aa_%d%_%t%.txt"
  12. ren "2.txt" "2.bb_%d%_%t%.txt"
  13. ren "4.txt" "4.cc_%d%_%t%.txt"
  14. ren "5.txt" "5.dd_%d%_%t%.txt"
复制代码

作者: 珠七七    时间: 2011-10-15 18:13

回复 7# awk
非常感谢你的帮助,可是我不要当前的时间,是要在time.txt所截取到字符的时间.
作者: 珠七七    时间: 2011-10-15 18:16

本帖最后由 珠七七 于 2011-10-15 18:19 编辑

回复 6# CrLf
我只是要结果,如果大家另外设计一个批处理,我非常感谢.
我的目标是把1.txt,2.txt...重命名为:
1.aa_当前年月日_time.txt所截取第一行的时间.txt(结果:1.aa_20111015_0452.txt)
2.bb_当前年月日_time.txt所截取第二行的时间.txt(结果:2.bb_20111015_0453.txt)
..
这样明白了吗?
作者: Batcher    时间: 2011-10-15 18:21

回复 9# 珠七七


请把所有的需求全部更新到顶楼
作者: awk    时间: 2011-10-15 18:51

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set D=%date:~0,10%
  4. set D=%D:-=%
  5. set n=1
  6. for /f "delims=: tokens=1,2" %%a in (time.txt) do (
  7.     set T=0%%a%%b
  8.     ren "!n!.txt" "1.aa_%D%_!T!.txt"
  9.     set /a n+=1
  10. )
复制代码

作者: 珠七七    时间: 2011-10-15 19:08

回复 11# awk


    非常感谢你的帮助,代码有点错误,全部都命名为:
1.aa_20111015_0452.txt
1.aa_20111015_0453.txt
..
第二个文件应该是2.bb_20111015_0453.txt.
作者: awk    时间: 2011-10-15 19:56

回复 12# 珠七七
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set D=%date:~0,10%
  4. set D=%D:-=%
  5. set n=1
  6. for /f "delims=: tokens=1,2" %%a in (time.txt) do (
  7.     set T=0%%a%%b
  8.     ren "!n!.txt" "!n!.aa_%D%_!T!.txt"
  9.     set /a n+=1
  10. )
复制代码

作者: CrLf    时间: 2011-10-15 21:07

本帖最后由 CrLf 于 2011-10-15 21:21 编辑

考虑到兼容性,用变量偏移的笨办法获取当前日期...
  1. @echo off&setlocal enabledelayedexpansion
  2. set dt=%date:~,4%%date:~5,2%%date:~8,2%
  3. (for /f "delims=" %%a in (name.txt) do (
  4.         set /p str=
  5.         for /f "tokens=1,2 delims=:" %%b in ("!str!") do ren "%%a" "%%~a_%dt%_%%b%%c%.txt"
  6. ))<time.txt
  7. pause
复制代码

作者: 珠七七    时间: 2011-10-17 01:39

回复 14# CrLf


   谢谢你的指点,但是 这个批处理有点错误吧,提示找不到指定文件.

另外,自己从中找到的几条命令,不知道怎么把它们组合在一起,最后把文件更新为合适的文件名.
获取年月日的代码是:
  1. set dt=%date:~,4%%date:~5,2%%date:~8,2%
复制代码
从name.txt获取到前面的文件名是:
  1. for /f "delims=" %%a in (name.txt) do (set name=%%a)
复制代码
从time.txt获取到后面的文件名是:
  1. for /f "tokens=1,2 delims=:" %%b in (time.txt) do (set time=0%%b%%c)
复制代码
组合成新的文件名应该是:%name%_%dt%_%time%.txt
怎样把几条命令组合在一起呢?而且还要循环下去,直到获到到name.txt最后一行(总共有18行吧,除去3.txt,需要更改的是1至2.txt,4至19.txt)呢?
作者: 珠七七    时间: 2011-10-17 03:11

本帖最后由 珠七七 于 2011-10-17 03:22 编辑

经过深夜测试研究,修改14# CrLf 的代码,测试成功命名前面的部分,后面从time.txt获取的时间就不会改变.大家是否能给点帮助我呢?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set D=%date:~0,10%
  4. set D=%D:-=%
  5. set n=1
  6. for /f "delims=: tokens=1,2" %%a in (time.txt) do (
  7.     set T=0%%a%%b
  8.     for /f "delims=:" %%c in (name.txt) do (set aa=%%c
  9.     ren "!n!.txt" "!aa!_%D%_!T!.txt"
  10.     set /a n+=1
  11. ))
复制代码
非常感谢.
作者: bluewing009    时间: 2011-10-17 08:26

爪机,我就不上代码了,给你思路
findstr /n可以列出文本行号,这样,name文本也有序号了,一一对应用ren即可。
作者: awk    时间: 2011-10-17 13:36

回复 16# 珠七七


13的代码有问题没?
作者: 珠七七    时间: 2011-10-17 13:55

本帖最后由 珠七七 于 2011-10-17 13:59 编辑

回复 18# awk

13楼的代码没有问题,符合我当时的要求,最新的要求我也更新在顶楼.
现在的使用16楼的代码,实践的结果表明只能获取一个文本.第二个就只能获取到最后那一行.
结果:
name.txt第一行_年月日_time.txt最后一行
name.txt第二行_年月日_time.txt最后一行
name.txt第三行_年月日_time.txt最后一行
以此类推...
现在只剩这个难点了,两个文本同时获取第N行.请问你还有办法吗?
正确的结果应该是:
name.txt第一行_年月日_time.txt最后一行
name.txt第二行_年月日_time.txt最后二行
name.txt第三行_年月日_time.txt最后三行
以此类推...
我现在有一个想法,既然不能同时获取,那就先让1.txt,2.txt...先改前面部分,变为:
name.txt第一行_年月日_.txt
name.txt第二行_年月日_.txt
....
再运行另外一个批处理,获取文件名,再在相对应的文件名后面添加time.txt里面的内容.
还在研究中...
作者: 珠七七    时间: 2011-10-17 14:06

回复 17# bluewing009


    谢谢,刚学批处理,这个命令还不了解.我会学一下的.
作者: 珠七七    时间: 2011-10-17 15:01

分为两个批处理,测试成功了.
第一个
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set D=%date:~0,10%
  4. set D=%D:-=%
  5. set n=1
  6. for /f "delims=:" %%c in (name.txt) do (set aa=%%c
  7.     ren "!n!.txt" "!aa!_%D%.txt"
  8.     set /a n+=1
  9. )
复制代码
第二个
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set D=%date:~0,10%
  4. set D=%D:-=%
  5. set n=1
  6. for /f "delims=: tokens=1,2" %%a in (time.txt) do (
  7.     set T=0%%a%%b
  8.     ren "!n!.*" "!n!.*_%D%_!t!.txt"
  9.     set /a n+=1
  10. )
复制代码
其实第二个"    ren "!n!.*" "!n!.*_%D%_!t!.txt"   "这一行不知道是什么意思,可结果却刚好与我想要的一样.
感谢大家的帮助.特别是13# awk ,因为是修改你的代码而得到的.




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2