Windows 使用批处理语言查找文本并将其替换为txt

Windows 使用批处理语言查找文本并将其替换为txt,windows,batch-file,Windows,Batch File,我对代码有问题… 我有t1.txt和t2.txt文件。目标是使用相同的内容从文件1移动到文件2,除非它包含特定的单词,在这种情况下,整行必须替换为预定义的单词 具体来说,我对“if”和变量的重新分配有问题 @echo off setlocal enabledelayedexpansion set p1=t1.txt set p2=t2.txt for /f "tokens=*" %%a in (%p1%) do ( set nl=%%a if not "%n1%"=="%n1:t

我对代码有问题…
我有t1.txt和t2.txt文件。目标是使用相同的内容从文件1移动到文件2,除非它包含特定的单词,在这种情况下,整行必须替换为预定义的单词

具体来说,我对“if”和变量的重新分配有问题

@echo off
setlocal enabledelayedexpansion
set p1=t1.txt
set p2=t2.txt
for /f "tokens=*" %%a in (%p1%) do (
    set nl=%%a
    if not "%n1%"=="%n1:texto=%" (
        set n1=replace with this text
    )
    echo !n1! >> %p2%
)
pause>nul
exit

的命令始终忽略空行,默认情况下,它也忽略以分号开头的行。在使用延迟扩展时,在循环中执行命令行
set nl=%%a
时,也会修改包含感叹号的行。因此,根据文件
t1.txt
的内容,使用FOR的解决方案可能是完全错误的尝试

下载Dave Benham编写的
,这是一个批处理文件/JScript的混合体,可以使用JScript对文件运行正则表达式替换,并将其存储在与下面批处理文件相同的目录中

@echo off
if not exist "%~dp0jrepl.bat" goto :EOF
if not exist "t1.txt" goto :EOF

call "%~dp0jrepl.bat" "^.*textto.*$" "replace with this text" /F "t1.txt" /O "t2.txt"

rem Compare the two files binary with ignoring the differences. Delete file
rem t1.txt if a line was modified by JREPL.BAT. Otherwise move file t1.txt
rem over t2.txt to keep the last modification date of file t1.txt for t2.txt.
%SystemRoot%\System32\fc.exe /B "t1.txt" "t2.txt" >nul
if errorlevel 1 ( del "t1.txt" ) else move /Y "t1.txt" "t2.txt"
jrepl.bat
使用正则表达式搜索包含
textto
的行,并将所有此类行替换为
replace with this text
。所有其他行都未经修改地从输入文件
t1.txt
复制到输出文件
t2.txt

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
  • del/?
  • echo/?
  • fc/?
  • goto/?
  • 如果/?
  • 移动/?
  • rem/?
  • jrepl.bat/?

您的任务可以通过纯批处理脚本完成,但如果您希望以安全的方式完成任务,就某些特殊字符而言,并且不丢失原始文件的空行而言,这并不是那么简单。所以这里有一个方法:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_IFILE=t1.txt”&rem//(要处理的输入文件)
设置“_OFILE=t2.txt”&rem//(要返回的输出文件)
设置“\u WORD=\”&rem//(要在行中搜索的字符串,`findstr`正则表达式)
设置“\u REPL=replace with this text”&rem/(替换包含单词的行的文本)
rem//如果未提供输出文件,则输出到控制台:
如果未定义_OFILE set“_OFILE=con”
rem/*初始化循环计数器,该计数器应与行号同步,除非
rem一行与搜索字符串匹配,因此它将被跳过,并且数字不同:*/
设置/A“LCNT=0”
rem//写入输出文件:
>“%\u文件%”(
rem/*从输入文件读取,在每行前面加上行号+`:`,跳过行
匹配搜索字符串的rem:*/
对于/F delims^=^eol^=%%L in('cmd/V/C findstr/V/N/R/C:“!\u WORD!”“!\u IFILE!”)执行以下操作(
rem//从行字符串中拆分行号:
对于/F“delims=:”%%K in(“%%L”)do(
rem//递增循环计数器:
设置/A“LCNT+=1”
rem//存储当前行(包括行号前缀):
设置“行=%%L”
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem//检查循环计数器和行号是否不同:
如果!LCNT!lss%%K(
rem/*数字不同,因此返回替换行的次数相同
区别在于:*/
设置/A“差异=%%K-LCNT”
对于/L%%D in(1,1,!DIFF!)执行回显(!\u REPL!
)
rem//删除行号前缀的返回行:
回音(!行::=!
端部
rem//将环路计数器与行号同步:
设置“LCNT=%%K”
)
)
)
端部
退出/B
限制:

  • 行的长度不得超过约8190个字符(受和长度限制)
  • 搜索表达式的长度不得超过254个字符(受限制)
  • 输入的文本文件必须是ASCII/ANSI编码的(可能会错误地处理其他文件,具体取决于当前版本)
  • 输入文本文件不应包含代码高于
    0x7F
    的字符(
    cmd
    可能会将这些字符更改为其他字符,具体取决于当前代码页)
  • 输入文本文件必须具有DOS/Windows样式的行尾(理解Unix样式的行尾,但输出文本文件将具有DOS/Windows样式的行尾;完全不支持MAC样式的行尾)

这在C#中很简单。不要使用这种批处理语言,它已经有将近40年的历史了。使用更现代的工具。Powershell可以做到这一点。这是批处理失败的最常见原因。如果在(代码块)中设置和使用变量,则启用延迟扩展,并用
%替换包含变量的
%
(不适用于元变量)在echo中正确执行此操作一次,但在if命令中未执行此操作。
if not“!n1!”=”!n1:texto=!”
可能重复您为什么使用延迟扩展进行回音而不是比较??非常感谢您的回复,这正是我所寻找的。我开始使用这种语言,很难找到可靠的来源,您是否有文档可供共享?不客气!我通常指的是,它提供了更多信息比帮助页更重要(
/?
)…谢谢,但这是我需要的一个脚本,适用于许多具有不同版本windows的计算机,并且通常资源较低,因此我更喜欢批量执行。@juancommande没问题。
jrepl.bat
也适用于包括windows XP在内的每台windows计算机,因为它使用的是windows脚本主机,这是一个本机安装的comp不过,如果发布的解决方案更适合你,那没关系。我