Board logo

标题: [文本处理] (已解决)BAT脚本如何修改指定目录下的文本文件内指定行的内容? [打印本页]

作者: heimahack    时间: 2018-9-24 20:51     标题: (已解决)BAT脚本如何修改指定目录下的文本文件内指定行的内容?

本帖最后由 heimahack 于 2023-1-8 13:22 编辑

我现在有个  !Setup.txt   这文件,它前面是带有感叹号的。我想修改它里面的第1001行的内空。比如我想在1001行写入   MaxLevel=255  批处理该怎么写?请教批处理高手解决。10元红包解决
作者: heimahack    时间: 2018-9-24 21:24

没有高手在线啊?
作者: Batcher    时间: 2018-9-24 22:02

测试代码执行注意事先备份好文件
  1. @echo off
  2. (for /f "tokens=1* delims=:" %%a in ('type "!Setup.txt" ^| findstr /n .*') do (
  3.     if %%a equ 1001 (
  4.         echo MaxLevel=255
  5.     ) else (
  6.         echo,%%b
  7.     )
  8. ))>"!Setup.bathome.net"
  9. move /y "!Setup.bathome.net" "!Setup.txt"
复制代码

作者: heimahack    时间: 2018-9-24 22:11

你这么搞,我好喜欢你了。
作者: Batcher    时间: 2018-9-25 15:51

回复 1# heimahack


文本内容包含大量特殊字符的情况下,可以试试这样:
  1. @echo off
  2. powershell -c "Get-Content !Setup.txt | Foreach {$n=1}{if($n++ -eq 1001){'MaxLevel=255'}else{$_}}" > !Setup.bathome.net
  3. move /y "!Setup.bathome.net" "!Setup.txt"
复制代码

作者: heimahack    时间: 2018-9-25 17:15

回复 5# Batcher


    我试用一下。貌似好复杂了
作者: Batcher    时间: 2018-9-25 17:17

回复 6# heimahack


    5楼代码有一处笔误,我刚刚更新了,你重新测试一下吧。
作者: heimahack    时间: 2018-9-25 17:24

回复 5# Batcher


    不行,命令报错了,
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
作者: heimahack    时间: 2018-9-25 17:42

回复 7# Batcher


    还是一样的,'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
作者: flashercs    时间: 2018-9-25 17:45

本帖最后由 flashercs 于 2018-9-25 17:51 编辑

bat在开启变量延迟后好像文件名含有 ! 的的文件不能找到了,这是bug吗?
  1. @echo off
  2. set "file=!Setup.txt"
  3. set /a "cnt=1"
  4. for /f "delims=" %%a in ('"type "%file%"&&cd.>"%file%""') do (
  5.     >>"%file%",call :fn "%%a" %%cnt%%
  6.     set /a "cnt+=1"
  7. )
  8. pause
  9. exit /b
  10. :fn
  11. if %2 equ 1001 (
  12.     echo,MaxLevel=255
  13. ) else (
  14.     echo,%~1
  15. )
复制代码
bat的字符处理确实不行,若行中有特殊字符像 & | > <就出错,稳妥还是用powershell
或vbs  js
作者: flashercs    时间: 2018-9-25 17:48

回复 9# heimahack


    什么Windows系统没有power shell ?
作者: heimahack    时间: 2018-9-25 17:50

回复 11# flashercs


    我是WIN 2003系统
作者: flashercs    时间: 2018-9-25 17:53

回复 12# heimahack


    2003可能没有powershell环境。。。。。
但bat不稳定,用vbs或js可行吧。
作者: heimahack    时间: 2018-9-25 18:02

本帖最后由 heimahack 于 2018-9-25 18:05 编辑

回复 13# flashercs

用VBS可以,但我是想在D:\123\1.txt 文本内的1001行写入  CHECKGAMEGOLD > 4   这段字符

也就是D:\123\1.txt这个文件路径也得写在VBs内
作者: flashercs    时间: 2018-9-25 19:14

本帖最后由 flashercs 于 2018-9-25 21:14 编辑

回复 14# heimahack
保存为 替换行.js 文件
  1. (function(e){function t(e,t){WScript.Echo("[object Error]"===Object.prototype.toString.call(e)?[e.name,"source: "+(void 0===t?"":t),"number: "+(e.number>>>0).toString(16),"equipment: "+(e.number>>16&8191),"code: "+(65535&e.number),"Information: "+e.message].join("\n"):e)}var i,r,n,c=new ActiveXObject("Scripting.FileSystemObject"),o=/[^\r\n]*(\r\n|\n|\r)/g,l=0;new ActiveXObject("WScript.Shell").CurrentDirectory=c.GetParentFolderName(WScript.ScriptFullName),file=""+e.file;try{i=c.OpenTextFile(file,1,!1)}catch(e){return void t(e,"Opening file "+file)}r=i.ReadAll(),i.Close();try{i=c.OpenTextFile(file,2,!1)}catch(e){return void t(e,"Writing to file "+file)}for(;n=o.exec(r);)i.Write(void 0===e[++l]?n[0]:e[l]+n[1]);i.Close()})({file:"D:\\work\\1.txt",1001:"CHECKGAMEGOLD > 4",66:"MAXLEVEL=255"});
复制代码
功能:替换文本指定行
参数:file:“要替换的文件名”   注: 文件路径名用\\而不是\分割符
        行数:"要替换的文字"     可以替换多行。
作者: Batcher    时间: 2018-9-25 20:25

回复 13# flashercs


    先试试15楼的代码吧。如果是公司的服务器,强烈建议升级到2012以上的版本。
作者: heimahack    时间: 2018-9-25 21:54

Js能直接双击运行?
作者: heimahack    时间: 2018-9-27 17:02

回复 15# flashercs


    嗯,非常有效果,谢谢你
作者: heimahack    时间: 2018-9-27 17:44

回复 15# flashercs

(function(e){function t(e,t){WScript.Echo("[object Error]"===Object.prototype.toString.call(e)?[e.name,"source: "+(void 0===t?"":t),"number: "+(e.number>>>0).toString(16),"equipment: "+(e.number>>16&8191),"code: "+(65535&e.number),"Information: "+e.message].join("\n"):e)}var i,r,n,c=new ActiveXObject("Scripting.FileSystemObject"),o=/[^\r\n]*(\r\n|\n|\r)/g,l=0;new ActiveXObject("WScript.Shell").CurrentDirectory=c.GetParentFolderName(WScript.ScriptFullName),file=""+e.file;try{i=c.OpenTextFile(file,1,!1)}catch(e){return void t(e,"Opening file "+file)}r=i.ReadAll(),i.Close();try{i=c.OpenTextFile(file,2,!1)}catch(e){return void t(e,"Writing to file "+file)}for(;n=o.exec(r);)i.Write(void 0===e[++l]?n[0]:e[l]+n[1]);i.Close()})
({file:"D:\\3.txt",1043:"CHECKGAMEGOLD > 4"});


呵呵,还是不行,会把最后面一行给删掉。算拉。不整它了。还是很感谢大家的




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