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

[文本处理] [已解决]求助批处理用一个文件的内容替换另一个文件一整段内容

本帖最后由 hnfeng 于 2023-11-30 14:45 编辑

一个批处理里面有多个 标签(类似以 :abcd 开头以 goto :EOF 结尾),想使用第三方程序把另一个文件例如 NewTxt.txt 的全部内容替换到:abcdgoto :EOF 之间的内容

例如:用 NewTxt.txt 的内容替换下面全部蓝色字符
@echo off
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
call :abcd
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
exit

:abcd
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码

goto :EOF

:xyz
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
goto :EOF


请高手帮忙指导,谢谢了
1

评分人数

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

因我无发帖权限,跟帖到这里吧。

===============================
批处理:常用Windows命令快捷打开
===============================
近日整理修改了一下多年前写的这个批处理,给大家玩玩。

1、特点
   自动生成菜单,只需按下面第2点的方法添加命令即可。
   多种菜单显示方式(文件名已明示),可选用自己喜欢的一两种来使用。
   方便添加修改删除命令,改为自己专用的。
   命令个数若有变化,菜单会自动适应改变,不需要再去人工大量调整菜单,但是批处理窗口的总列数(宽度)和菜单项显示的起点列坐标是需要指定的。调整到你满意的位置(序号的起点列坐标一般是8的倍数加3或减5,命令和注释的列坐标就是8的倍数)

2、如何增加里面的命令:

   菜单内容保存在以下子批处理文件里。这些文件被主批处理调用以后,自动显示为菜单。你只需要修改这些就能改变显示的菜单
     MenuSys.bat ------------- 常用命令
     MenuSys_Color.bat ------- 常用命令,醒目文字
     MenuSys+Mine.bat -------- 常用命令+我自己的
     MenuSys+Mine_Color.bat -- 常用命令+我自己的,醒目文字

   主批处理调用菜单子批处理的关系如下(你也可以自己修改主批处理里面的call命令来更改)
   ----------------------------------------------------------------------------------
   常用Windows命令快捷打开-2列_1色.bat                      调用 MenuSys.bat
   常用Windows命令快捷打开-2列_2色.bat                      调用 MenuSys.bat
   常用Windows命令快捷打开-2列_3色.bat                      调用 MenuSys.bat
   常用Windows命令快捷打开-2列_3色_快显.bat                 调用 MenuSys.bat
   常用Windows命令快捷打开-2列_Z_1色.bat                   调用 MenuSys.bat
   常用Windows命令快捷打开-2列_Z_2色.bat                   调用 MenuSys.bat
   常用Windows命令快捷打开-2列_3色_快显_醒目文字.bat        调用 MenuSys_Color.bat
   常用Windows命令快捷打开-2列_3色_醒目文字.bat             调用 MenuSys_Color.bat
   常用Windows命令快捷打开-3列_3色.bat                      调用 MenuSys+Mine.bat
   常用Windows命令快捷打开-3列_3色_快显.bat                 调用 MenuSys+Mine.bat
   常用Windows命令快捷打开-3列_3色_快显_醒目文字.bat        调用 MenuSys+Mine_Color.bat
   常用Windows命令快捷打开-3列_3色_醒目文字.bat             调用 MenuSys+Mine_Color.bat

   按照如下的格式添加、修改批处理里面的内容

   格式为:
   set Ann=nn        app_name [参数]        注释

   > 等号前后的序号 nn 必须一样,而且不要重复,但是可以不是连续的。
   > nn 与程序名之间是 TAB,注释前面那个也是 TAB,程序与其参数之间是空格

   例如:
   set A39=39        notepad.exe        记事本

   这样,你可以制作自己的快捷命令菜单

     对于CMD命令,建议写个批处理来调用
     对于路径或文件名较长的程序,建议创建快捷方式或者批处理来调用
     对于一个文件夹或屏幕保护,建议创建快捷方式来打开
     对于普通文档(已有默认关联程序的),直接写入或利用快捷方式(txt,xlsx,docx......)

   批量添加修改时,使用EXCEL处理会更高效率,处理好以后只需复制粘贴到批处理里面即可。

   3列显示的批处理里面有我的一些常用小工具的快捷方式,我没有删掉只是为了示例,你可以直接删掉改为你自己的。

3、关于cmdow.exe
   因为默认情况下,CMD窗口打开时,位置并不是固定的,行数较多CMD窗口较长时,可能有部分内容跑到了桌面外面了,还需要手动调整CMD窗口的位置。这个开源小程序可以把窗口移动到桌面指定(如左上角)的位置,另外本批处理还使用了其最小化窗口的功能。
   需要说明一点的是,这个小程序被多个杀毒软件报毒,可能因为其功能所致。用不用自己斟酌。我是使用了多年了。
   如果不需要这两个功能或者不放心,可以直接删掉cmdow.exe,不影响批处理的使用。

   cmdow.exe 说明、源代码、程序的下载:
   https://ritchielawrence.github.io/cmdow/
   (cmdow.exe v1.4.8 原始大小 88,576 字节, SHA1: 8FEF2C2BC87EF7D135296FDB4CF9ECD9C0322D55)
   我使用最新版的 upx.exe 4.2.1.0 压缩了一下(https://upx.github.io

   几个中文介绍网页
   https://www.cnblogs.com/AnKen/p/7992695.html
   https://www.xp.cn/b.php/36278.html

4、关于syba.exe
   是批处理之家(http://bbs.bathome.net)一个高手多年前写的开源工具,本批处理主要利用其在CMD窗口指定坐标以指定颜色显示字符的功能。单列菜单的可以不用,双列的是必需的,请放到批处理所在文件夹或者系统路径中。我也已经使用多年了。
   最新版本:http://bbs.bathome.net/thread-35261-1-1.html
   (我以前曾经用这个写过windows2000/XP/7,Office2010/2013/2016的批量打补丁进度条显示的批处理,不知有没人用过或记得)

5、让一些字符醒目
   有两种方法,各有特点。一是在菜单注释里面直接插入颜色控制符(只能针对注释,不能针对命令),二是在菜单显示的后面使用 syba.exe 在指定坐标显示指定颜色的字符(可以针对注释和命令及序号,但是在菜单命令数变化较大时,可能需要修正坐标位置)

一旦用久了,较常用的几个命令的编号可能不需去看注释了,直接输入序号、回车……

适合经常需要输入命令或调用某些命令、设置的人使用
适合干净桌面(桌面上没有或很少图标)的人使用
适合像我这样上了年纪记不住那么多命令和设置位置的老人使用
适合……想用的人使用





https://pan.baidu.com/s/1to_11LiqpRWEkIL6NyKsOA?pwd=1234
1

评分人数

TOP

来一个gawk处理一楼的示例,简单的逻辑,
  1. gawk "/^:goto EOF$/{n=0}!n{print}/^:abcd$/{n=1;while((getline<\"NewTxt.txt\")>0)print;next}" 1.bat>2.bat
复制代码

TOP

本帖最后由 hnfeng 于 2023-12-1 09:22 编辑

回复 5# qixiaobin0715


    代码也能成功完成,之前是我把 文件名 输错了,不好意思抱歉了

加行号的处理和使用 type 替换进来 NewTxt.txt 的内容的方法很巧妙

谢谢,赞一个

TOP

本帖最后由 hnfeng 于 2023-12-1 09:21 编辑

回复 12# WHY


    我看了看你的批处理代码,代码没问题,与 5 楼的代码一样,加行号的处理和使用 type 替换进来 NewTxt.txt 的内容的方法很巧妙,只是最后您忘记输出结果了

倒数第二行修改为  
)>>2.bat
就好了

赞一个

TOP

回复 11# hnfeng


    "不成功" 是指脚本运行时出错,还是指脚本运行后结果不对?
能否把你需要修改的 1.bat 和 NewTxt.txt 放到网盘,我测试一下。

TOP

回复 10# WHY


    gawk 命令有效,试验成功

纯批处理的,与5楼那个一样,不成功。

gawk 就蛮好的,谢谢

TOP

本帖最后由 WHY 于 2023-12-1 11:17 编辑

另一种办法:
  1. gawk -v IGNORECASE=1 "NR==FNR{a[NR]=$0;next}!n{print}!n&&/^:abcd$/{for(i in a)print a[i];n=1}n&&/^goto :EOF$/{print;n=0}" NewTxt.txt 1.bat > 2.bat
复制代码
也练习下纯批
改一下,少一个endlocal
  1. @echo off
  2. for /f "delims=" %%i in ('findstr /n .* 1.bat') do (
  3.     set "s=%%i"
  4.     setlocal enabledelayedexpansion
  5.     set "s=!s:*:=!"
  6.     if not defined flag (
  7.         echo;!s!
  8.         if /i "!s!" == ":abcd" (
  9.             endlocal
  10.             type NewTxt.txt | find /v ""
  11.             set flag=1
  12.         ) else (
  13.             endlocal
  14.         )
  15.     ) else if /i "!s!" == "goto :EOF" (
  16.         echo;!s!
  17.         endlocal
  18.         set "flag="
  19.     )  else (
  20.         endlocal
  21.     )
  22. )
  23. pause
复制代码
Test.js
  1. var txtFileName = 'NewTxt.txt';  //txt文件名
  2. var batFileName = '1.bat';       //修改前bat文件名
  3. var dstFileName = '2.bat';       //修改后bat文件名
  4. var fso = new ActiveXObject('Scripting.FileSystemObject');
  5. var s1 = fso.OpenTextFile(txtFileName, 1).ReadAll();  //读txt文本内容
  6. var s2 = fso.OpenTextFile(batFileName, 1).ReadAll();  //读bat文本内容
  7. s1 = s1.replace(/(?!\r\n).$/, '$&\r\n');  //txt结尾添加回车换行
  8. s2 = s2.replace(/^(:abcd\r\n)(?:(?!goto :EOF)[\s\S])+(?=goto :EOF)/mi, '$1' + s1); //替换内容
  9. fso.OpenTextFile(dstFileName, 2, true).Write(s2);
  10. WSH.Echo('Done')
复制代码
1

评分人数

TOP

回复 8# hnfeng


在调试/排错或维护一个大型批处理脚本时,用call调用其他外部批处理脚本(子过程/子模块)是常用的方法之一,如果单独运行某个子脚本无误,则在主脚本中用call调用这个子脚本也应该ok。
顺便给个提示》mshta的ie引擎到ie11版就不再支持vbs代码了,若非要使用须在mshta脚本中的头标签中加注有关的版本设定,例如头标签中至少包含如下代码
      <head><meta http-equiv="x-ua-compatible" content="ie=11"></head>

TOP

回复 7# aloha20200628


    您说的确实是一种不错的方法。

以前我也这样用过,但是后来发现,如果被调用的批处理开头有
mshta vbscript:CreateObject("Shell.Application"...............  或其他 VBS 那样以管理员身份运行 的命令时,可能会出错或有错误信息(可能因为主批处理已经有这些命令了,不能重复运行),所以此次没想到用这个方法。但是如果仅仅是变量赋值,就没这个问题了,行得通。

set 命令里添加引号比较麻烦(原始数据是从excel复制过来的),$% 这些肯定要用的(貌似也可以用), ^<|> 是不能使用的

谢谢指教

TOP


一楼想要的结果亦可尝试如下方案,如此不必文本替换了》仅供参考
一。若NewTxt.txt中内容皆为批处理代码,可改扩展名为 NewTxt.bat 或 NewTxt.cmd
二。其中的 set abc123=xxxxxxxxx 句式改为 set "abc123=xxxxxxxxx"  备注》即便用双引号包裹,也不要在赋值表达式中包含%!^<|>等批处理脚本内定的语义字符
三。一楼示例代码中先删除 :abcd 至 goto :EOF 段落,再将 call :abcd 改为 call NewTxt.bat,如此会使外部脚本中的 set "abc123=xxxxxxxxx" 句式被自动执行,变为当前脚本中相应的赋值变量

TOP

回复 4# hfxiang


    多谢多谢,非常好用

TOP

  1. @echo off
  2. (for /f "skip=1 tokens=1* delims=]" %%i in ('find /v /n "" test.bat') do (
  3.     if "%%j"==":abcd" (
  4.         set n=true
  5.         echo,%%j
  6.         type NewTxt.txt
  7.     ) else if defined n (
  8.         if "%%j"=="goto :EOF" (
  9.             echo,%%j
  10.             set n=
  11.         )
  12.     ) else (
  13.         echo,%%j
  14. )
  15. ))>New-test.bat
  16. pause
复制代码

TOP

回复 1# hnfeng

用gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )实现方法如下:
  1. gawk "/^:abcd$/,/^goto :EOF$/{if(/^:abcd$/){print;while((getline < \"NewTxt.txt\")>0){print}}if(/^goto :EOF$/)print;next}1" 1.bat>2.bat
复制代码
1

评分人数

TOP

本帖最后由 hnfeng 于 2023-11-30 09:03 编辑

回复 2# ShowCode


    需要替换的蓝色文字,其实是我的批处理里面用作设置变量的,格式全部是 set abc123=xxxxxxxxx
其中 xxxxxxxxx 可能含有 数字英文中文标点符号 !$()—-+【{}】;‘’:",。、《》TAB 等,如果有特殊符号不能使用,我可以不用

TOP

返回列表