[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理截取字符输出到文件时为何出错?

本帖最后由 珠七七 于 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文件的,其他的都有.这样的话应该怎么样呢?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
土土土土土土土土土土土

分为两个批处理,测试成功了.
第一个
  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 ,因为是修改你的代码而得到的.
土土土土土土土土土土土

TOP

回复 17# bluewing009


    谢谢,刚学批处理,这个命令还不了解.我会学一下的.
土土土土土土土土土土土

TOP

本帖最后由 珠七七 于 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里面的内容.
还在研究中...
土土土土土土土土土土土

TOP

回复 16# 珠七七


13的代码有问题没?

TOP

爪机,我就不上代码了,给你思路
findstr /n可以列出文本行号,这样,name文本也有序号了,一一对应用ren即可。

TOP

本帖最后由 珠七七 于 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. ))
复制代码
非常感谢.
土土土土土土土土土土土

TOP

回复 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)呢?
土土土土土土土土土土土

TOP

本帖最后由 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
复制代码

TOP

回复 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. )
复制代码

TOP

回复 11# awk


    非常感谢你的帮助,代码有点错误,全部都命名为:
1.aa_20111015_0452.txt
1.aa_20111015_0453.txt
..
第二个文件应该是2.bb_20111015_0453.txt.
土土土土土土土土土土土

TOP

  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. )
复制代码

TOP

回复 9# 珠七七


请把所有的需求全部更新到顶楼
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 珠七七 于 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)
..
这样明白了吗?
土土土土土土土土土土土

TOP

回复 7# awk
非常感谢你的帮助,可是我不要当前的时间,是要在time.txt所截取到字符的时间.
土土土土土土土土土土土

TOP

返回列表