标题: [文本处理] [已解决]求助批处理用一个文件的内容替换另一个文件一整段内容 [打印本页]
作者: hnfeng 时间: 2023-11-30 07:49 标题: [已解决]求助批处理用一个文件的内容替换另一个文件一整段内容
本帖最后由 hnfeng 于 2023-11-30 14:45 编辑
一个批处理里面有多个 标签(类似以 :abcd 开头以 goto :EOF 结尾),想使用第三方程序把另一个文件例如 NewTxt.txt 的全部内容替换到:abcd 至 goto :EOF 之间的内容
例如:用 NewTxt.txt 的内容替换下面全部蓝色字符
@echo off
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
call :abcd
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
exit
:abcd
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
goto :EOF
:xyz
xxxxxxx 多行批处理代码
xxxxxxx 多行批处理代码
goto :EOF
请高手帮忙指导,谢谢了
作者: ShowCode 时间: 2023-11-30 08:39
回复 1# hnfeng
考虑到众多特殊字符的问题,建议说说最根本的真实原因,也许有更便捷的实现方案。
作者: hnfeng 时间: 2023-11-30 09:01
本帖最后由 hnfeng 于 2023-11-30 09:03 编辑
回复 2# ShowCode
需要替换的蓝色文字,其实是我的批处理里面用作设置变量的,格式全部是 set abc123=xxxxxxxxx
其中 xxxxxxxxx 可能含有 数字英文中文标点符号 !$()—-+【{}】;‘’:",。、《》TAB 等,如果有特殊符号不能使用,我可以不用
作者: hfxiang 时间: 2023-11-30 09:13
回复 1# hnfeng
用gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )实现方法如下:- gawk "/^:abcd$/,/^goto :EOF$/{if(/^:abcd$/){print;while((getline < \"NewTxt.txt\")>0){print}}if(/^goto :EOF$/)print;next}1" 1.bat>2.bat
复制代码
作者: qixiaobin0715 时间: 2023-11-30 11:15
- @echo off
- (for /f "skip=1 tokens=1* delims=]" %%i in ('find /v /n "" test.bat') do (
- if "%%j"==":abcd" (
- set n=true
- echo,%%j
- type NewTxt.txt
- ) else if defined n (
- if "%%j"=="goto :EOF" (
- echo,%%j
- set n=
- )
- ) else (
- echo,%%j
- )
- ))>New-test.bat
- pause
复制代码
作者: hnfeng 时间: 2023-11-30 11:39
回复 4# hfxiang
多谢多谢,非常好用
作者: aloha20200628 时间: 2023-11-30 12:42
一楼想要的结果亦可尝试如下方案,如此不必文本替换了》仅供参考
一。若NewTxt.txt中内容皆为批处理代码,可改扩展名为 NewTxt.bat 或 NewTxt.cmd
二。其中的 set abc123=xxxxxxxxx 句式改为 set "abc123=xxxxxxxxx" 备注》即便用双引号包裹,也不要在赋值表达式中包含%!^<|>等批处理脚本内定的语义字符
三。一楼示例代码中先删除 :abcd 至 goto :EOF 段落,再将 call :abcd 改为 call NewTxt.bat,如此会使外部脚本中的 set "abc123=xxxxxxxxx" 句式被自动执行,变为当前脚本中相应的赋值变量
作者: hnfeng 时间: 2023-11-30 13:34
回复 7# aloha20200628
您说的确实是一种不错的方法。
以前我也这样用过,但是后来发现,如果被调用的批处理开头有
mshta vbscript:CreateObject("Shell.Application"............... 或其他 VBS 那样以管理员身份运行 的命令时,可能会出错或有错误信息(可能因为主批处理已经有这些命令了,不能重复运行),所以此次没想到用这个方法。但是如果仅仅是变量赋值,就没这个问题了,行得通。
set 命令里添加引号比较麻烦(原始数据是从excel复制过来的),$% 这些肯定要用的(貌似也可以用), ^<|> 是不能使用的
谢谢指教
作者: aloha20200628 时间: 2023-11-30 16:27
回复 8# hnfeng
在调试/排错或维护一个大型批处理脚本时,用call调用其他外部批处理脚本(子过程/子模块)是常用的方法之一,如果单独运行某个子脚本无误,则在主脚本中用call调用这个子脚本也应该ok。
顺便给个提示》mshta的ie引擎到ie11版就不再支持vbs代码了,若非要使用须在mshta脚本中的头标签中加注有关的版本设定,例如头标签中至少包含如下代码
<head><meta http-equiv="x-ua-compatible" content="ie=11"></head>
作者: WHY 时间: 2023-11-30 16:29
本帖最后由 WHY 于 2023-12-1 11:17 编辑
另一种办法:- 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- @echo off
- for /f "delims=" %%i in ('findstr /n .* 1.bat') do (
- set "s=%%i"
- setlocal enabledelayedexpansion
- set "s=!s:*:=!"
- if not defined flag (
- echo;!s!
- if /i "!s!" == ":abcd" (
- endlocal
- type NewTxt.txt | find /v ""
- set flag=1
- ) else (
- endlocal
- )
- ) else if /i "!s!" == "goto :EOF" (
- echo;!s!
- endlocal
- set "flag="
- ) else (
- endlocal
- )
- )
- pause
复制代码
Test.js- var txtFileName = 'NewTxt.txt'; //txt文件名
- var batFileName = '1.bat'; //修改前bat文件名
- var dstFileName = '2.bat'; //修改后bat文件名
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- var s1 = fso.OpenTextFile(txtFileName, 1).ReadAll(); //读txt文本内容
- var s2 = fso.OpenTextFile(batFileName, 1).ReadAll(); //读bat文本内容
-
- s1 = s1.replace(/(?!\r\n).$/, '$&\r\n'); //txt结尾添加回车换行
- s2 = s2.replace(/^(:abcd\r\n)(?:(?!goto :EOF)[\s\S])+(?=goto :EOF)/mi, '$1' + s1); //替换内容
-
- fso.OpenTextFile(dstFileName, 2, true).Write(s2);
-
- WSH.Echo('Done')
复制代码
作者: hnfeng 时间: 2023-11-30 16:50
回复 10# WHY
gawk 命令有效,试验成功
纯批处理的,与5楼那个一样,不成功。
gawk 就蛮好的,谢谢
作者: WHY 时间: 2023-11-30 19:33
回复 11# hnfeng
"不成功" 是指脚本运行时出错,还是指脚本运行后结果不对?
能否把你需要修改的 1.bat 和 NewTxt.txt 放到网盘,我测试一下。
作者: hnfeng 时间: 2023-12-1 09:11
本帖最后由 hnfeng 于 2023-12-1 09:21 编辑
回复 12# WHY
我看了看你的批处理代码,代码没问题,与 5 楼的代码一样,加行号的处理和使用 type 替换进来 NewTxt.txt 的内容的方法很巧妙,只是最后您忘记输出结果了
倒数第二行修改为
)>>2.bat
就好了
赞一个
作者: hnfeng 时间: 2023-12-1 09:16
本帖最后由 hnfeng 于 2023-12-1 09:22 编辑
回复 5# qixiaobin0715
代码也能成功完成,之前是我把 文件名 输错了,不好意思抱歉了
加行号的处理和使用 type 替换进来 NewTxt.txt 的内容的方法很巧妙
谢谢,赞一个
作者: terse 时间: 2023-12-1 19:20
来一个gawk处理一楼的示例,简单的逻辑,- gawk "/^:goto EOF$/{n=0}!n{print}/^:abcd$/{n=1;while((getline<\"NewTxt.txt\")>0)print;next}" 1.bat>2.bat
复制代码
作者: hnfeng 时间: 2023-12-3 10:18
因我无发帖权限,跟帖到这里吧。
===============================
批处理:常用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
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |