Batch file 如何处理字符串搜索/替换中的特殊字符(<;、>;、";、=)

Batch file 如何处理字符串搜索/替换中的特殊字符(<;、>;、";、=),batch-file,replace,cmd,special-characters,Batch File,Replace,Cmd,Special Characters,我根据堆栈溢出改编了这个脚本。脚本可以工作,但由于搜索查询中的特殊字符(,“,=),输出不正确 基本上,我只需要找到并删除它 setlocal EnableExtensions DisableDelayedExpansion set "search=<script src="https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js" type="text/javascript" integrity="sha256-FgpCb

我根据堆栈溢出改编了这个脚本。脚本可以工作,但由于搜索查询中的特殊字符(
=
),输出不正确

基本上,我只需要找到并删除它

setlocal EnableExtensions DisableDelayedExpansion

set "search=<script src="https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js" type="text/javascript" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>"
set "replace="

set "textFile=index.html"
set "rootDir=."

for %%j in ("%rootDir%\%textFile%") do (
    for /f "delims=" %%i in ('type "%%~j" ^& break ^> "%%~j"') do (
        set "line=%%i"
        setlocal EnableDelayedExpansion
        set "line=!line:%search%=%replace%!"
        >>"%%~j" echo(!line!
        endlocal
    )
)
endlocal
setlocal EnableExtensions DisableDelayedExpansion
设置“搜索=”
设置“替换=”
设置“textFile=index.html”
设置“rootDir=”
对于“%rootDir%\%textFile%”中的%%j,请执行以下操作(
对于/f“delims=“%%i in('type“%%~j”^&break^>“%%~j””)do(
设置“行=%%i”
setlocal EnableDelayedExpansion
设置“行=!行:%search%=%replace%”
>>“%%~j”回声(!行!
端部
)
)
端部

我发现堆栈溢出上的其他线程也在问同样的问题,但我无法理解它们的实现以及如何将它们应用于此脚本。

Windows command processor
cmd.exe
是为执行命令和应用程序而设计的。它不是为独立于文件类型的文件内容修改而设计的

有许多脚本解释器内置支持修改文件内容,如VBScript、JScript、PowerShell、Perl、Python等,因此最好使用不同于Windows命令处理器的脚本解释器来执行此任务,尤其是在搜索或替换字符串时。
”|
这使得使用纯Windows命令处理器命令修改文件内容成为一场噩梦

但是,使用Dave Benham编写的批处理文件/JScript混合体,使用JScript在文件上运行正则表达式替换,这是一项容易实现的任务

@echo off
if not exist ".\index.html" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF

call "%~dp0jrepl.bat" "[\t ]*<script src=\x22https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js\x22 type=\x22text/javascript\x22 integrity=\x22sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=\x22 crossorigin=\x22anonymous\x22></script>[\t ]*\r?\n?" "" /M /F ".\index.html" /O -
@echo关闭
如果不存在“\index.html”转到:EOF
如果不存在“%~dp0jrepl.bat”转到:EOF
调用“%~dp0jrepl.bat”“[\t]*[\t]*\r?\n?”“/M/F”“\index.html”/O-
批处理文件首先检查当前目录中是否存在
index.html
文件,如果此条件不成立,则立即退出,请参阅

批处理文件JREPL.BAT必须存储在与具有上述代码的批处理文件相同的目录中。因此,批处理文件接下来会检查JREPL.BAT是否确实存在于批处理文件的目录中,如果此条件不成立,则会退出

接下来,批处理文件调用JREPL.BAT以执行区分大小写的正则表达式替换,替换字符串为空字符串

搜索字符串主要是应该从文件中删除的字符串

搜索字符串中的每个
都替换为
\x22
,这是一个表达式,用于搜索十六进制代码值
22
的字符,该值是字符
的代码值,以便能够在Windows命令行上将此字符串指定为一个参数字符串,并用双引号括起来

主搜索字符串不包含任何具有特殊正则表达式含义的字符,因此任何其他字符都不必使用反斜杠转义,以便JScript的正则表达式函数将其解释为文字字符

主搜索字符串也不包含任何带有特殊Windows命令处理器的字符,这意味着即使在双引号参数字符串(如百分号
%
)中也不包含任何字符。搜索字符串中的每个
%
都需要用另一个
%
转义,以便
cmd.ex将其解释为文字字符e
在使用已解析的参数调用其他批处理文件之前解析此命令行

搜索表达式以
[\t]*
开头,以删除要删除的字符串剩余的0个或多个水平制表符或普通空格。要删除的字符串通常位于HTML文件中的单独一行,并用制表符或空格缩进,目标是删除那些缩进的空格

搜索表达式以
[\t]*\r?\n?
结尾,以删除字符串右侧的0个或多个水平制表符或普通空格,即行上的尾随空格,如果存在,则返回一个回车符,如果存在,则返回一个换行符

因此,如果要删除的字符串位于HTML文件中的单独一行,不带或带有前导制表符/空格,不带或带有尾随制表符/空格,则会从文件中删除整行。但是,如果要删除的字符串位于带有其他HTML标记的行中,则只会从HTM中删除搜索的字符串以及该字符串左右两侧的制表符/空格L文件。JREPL.BAT选项
/M
用于删除整行,而不仅仅是行内的搜索字符串,并在单独的行上的脚本标记上留下空行

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

  • call/?
    …还解释了作为批处理文件本身的参数0的驱动器和路径
  • echo/?
  • goto/?
  • 如果/?
  • jrepl.bat/?

Windows命令处理器
cmd.exe
是为执行命令和应用程序而设计的。它不是为独立于文件类型的文件内容修改而设计的

有许多脚本解释器内置支持修改文件内容,如VBScript、JScript、PowerShell、Perl、Python等,因此最好使用不同于Windows命令处理器的脚本解释器来执行此任务,尤其是在搜索或替换字符串包含
“|
这使得使用纯Windows命令处理器命令修改文件内容成为一场噩梦

但是,使用Dave Benham编写的一个