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

[文本处理] 【已解决】如何批量将文件名插入到文本第1行和第2行之间?

本帖最后由 wzf1024 于 2016-3-28 23:33 编辑

有很多txt文本,文件名不同,如何批处理把文件名插入成为第2行,其他内容后退,
比如有文本名为hello.txt,内容是:
1111111111111
2222222222222
3333333333333
……
操作后实现:
1111111111111
hello
2222222222222
3333333333333
……
哪位大侠帮忙菜鸟,谢谢

回复 1# wzf1024
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%A in ('dir /a-d /b /s *.txt') do (
  3. (for /f "tokens=1* delims=:" %%a in ('type "%%A"^|findstr /n .*') do (
  4. if %%a equ 2 (echo,%%~nA)
  5. echo,%%b
  6. ))>"%%A.bak"
  7. del "%%A"
  8. ren "%%A.bak" "%%~nxA"
  9. )
  10. set /p =执行完毕!
复制代码
1

评分人数

TOP

本帖最后由 pcl_test 于 2016-3-28 23:13 编辑
  1. @echo off
  2. ::取决more的限制
  3. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  4.     (
  5.       set/pa=
  6.       setlocal enabledelayedexpansion
  7.       echo;!a!
  8.       endlocal
  9.       echo;%%~na
  10.       more +1
  11.     )<"%%a">$
  12.     move $ "%%a"
  13. )
  14. pause
复制代码
1

评分人数

    • wzf1024: 乐于助人,考虑周到,非常感谢技术 + 1

TOP

回复 2# happy886rr


要是首字符为:呢

TOP

回复 3# pcl_test


    不需要用 more +1 吧,因为 set /p 已经取走一行了,另外,建议把 set /p a= 放到 setlocal 之后,否则应事先 set "a="

TOP

happy886rr大虾的处理的确会把行首的:删除,但容易扩展成把文件名插入任意行间;
pcl_test大虾的处理考虑周到,但只能把文件名插入1行和2行间,似乎扩展不了(可能我菜,不懂扩展)。
但目的达到,非常感谢各位大虾!!

TOP

gawk 也是个好选择:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  3.    gawk "FNR==2{print FILENAME};1" "%%a" >$
  4.    ren $ "%%a"
  5. )
复制代码

TOP

回复 5# CrLf

什么鬼

TOP

  1. /*&cls
  2. @echo off
  3. ::指定在第一行之后插入
  4. set n=1
  5. dir /a-d /b *.txt|cscript -nologo -e:jscript "%~f0" %n%
  6. pause&exit
  7. */
  8. var fso = new ActiveXObject('Scripting.FileSystemObject');
  9. while(!WScript.StdIn.AtEndOfStream){
  10.     var file = WScript.StdIn.ReadLine();
  11.     var i = 0, s = '', f = fso.OpenTextFile(file, 1);
  12.     while(!f.AtEndOfStream){
  13.     if(i == WScript.Arguments(0))s += fso.GetFile(file).Name.replace(/\.[^\.]+$/, '') + '\r\n';
  14.         var str = f.ReadLine();
  15.         s += str + '\r\n';
  16.         i++;
  17.     }
  18.     f.Close();
  19.     var f = fso.OpenTextFile(file, 2);
  20.     f.Write(s);
  21.     f.Close();
  22. }
复制代码
1

评分人数

    • wzf1024: 感谢分享,感谢大大追踪扩展技术 + 1

TOP

本帖最后由 CrLf 于 2016-3-29 01:16 编辑

回复 8# pcl_test


比如这样:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  3.     (
  4.       setlocal enabledelayedexpansion
  5.       set/pa=
  6.       echo;!a!
  7.       endlocal
  8.       echo;%%~na
  9.       find /v ""
  10.     )<"%%a">$
  11.     move $ "%%a"
  12. )
  13. pause
复制代码

---------------------------------------
实测发现 3 楼 more +1 的用法无误
那么问题来了,set /p 已经取走第一行了,为什么 more 还能再得到一个首行?

TOP

hta 版:
  1. mshta http://bathome.net/s/hta/ "var n=1; dir().files().grep(/\.txt$/i)._each(function(f){var a=type(f).split('\r\n');a.splice(n,0,f.replace(/\.[^.]+$/,''));save(a.join('\r\n'),f)})"
复制代码

TOP

喔,大家讨论激烈,看来我们论坛很有活力啊

TOP

顶一下帖子上去,貌似以后要用到

TOP

回复 12# happy886rr


    可以改用 "delims=" ... set "str=%%a" & setlocal enabledelayedexpansion & echo !str:*:=! & endlocal,一样可以兼容特殊字符

TOP

本帖最后由 happy886rr 于 2016-3-30 00:52 编辑

回复 15# CrLf
不错,看来这招可行。

TOP

返回列表