首页 > 解决方案 > 使用文件名查找和替换某些字符之间的文本

问题描述

用文件名查找和替换某些字符之间的文本,大约有 100 个文件需要这个,所以我认为它需要出现或其他什么。

原始文件名:test1.txt

内部文件用文件名替换以下两行(在每个文件中,下面的字符串可能不是紧挨着的):

location000:/computer/[project]/name/123.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/123.php,32,1,2,512,0,,txt

在文件 test1.txt 中输出

location000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt

标签: powershellbatch-filereplace

解决方案


使用Dave Benham编写的JREPL.BAT是一个很容易实现的任务,它是一个批处理文件/JScript 混合体,可以使用 JScript 在文件上运行正则表达式替换。

@echo off
if not exist "%~dp0jrepl.bat" (
    echo ERROR: JREPL.BAT missing in directory "%~dp0".
    echo/
    pause
    goto :EOF
)

for %%I in ("C:\Temp\*.txt") do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "%%I" /O -

此批处理文件仅适用于 NTFS 驱动器。它可能导致 FAT16、FAT32 或 ExFAT 驱动器上的无限循环运行或跳过某些文本文件。对于独立于文件系统的工作解决方案,将最后一个命令行替换为:

for /F "eol=| delims=" %%I in ('dir "C:\Temp\*.txt" /A-D-H /B /ON 2^>nul') do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "C:\Temp\%%I" /O -

批处理文件JREPL.BAT必须与上面代码的批处理文件存储在同一目录中。因此,批处理文件首先检查JREPL.BAT是否确实存在于批处理文件的目录中,如果不是,则输出错误消息,停止脚本执行以使用户可以阅读该错误消息,然后退出。请参阅GOTO :EOF 返回到哪里?

命令FOR在指定目录中搜​​索C:\Temp与通配符模式匹配的非隐藏文件,*.txt并为每个找到的文本文件调用批处理文件JREPL.BAT以替换最后一个 /第一个字符串之间的文件名.,其中一个或多个字符不是点或逗号,下一个字符为(= 文件扩展名和逗号)在以当前 *.txt 文件的文件名开头的行上区分大小写,不带文件扩展名,。因此,现有文件中的文件名在文件扩展名之前的文件名中也可以包含一个或多个。location000:/newlocation000:/.

也适用于 FAT 驱动器的解决方案使用命令DIR获取捕获的 *.txt 文件列表,其中仅包含文件名和文件扩展名而没有路径,FOR逐行处理此文件名列表,即逐个文件名。因此,在运行FOR调用JREPL.BAT时,要处理的 *.txt 文件列表不会改变,因为直接使用FOR在 FAT 驱动器上查找 *.txt 文件就是这种情况。

NTFS 返回与通配符模式匹配的目录条目列表,按字母顺序排序,因此在这种情况下,*.txt 文件列表在FOR迭代期间不会修改。但是所有 FAT 文件系统都根据目录中的最后修改返回与通配符模式匹配的目录条目列表,最后修改的文件位于列表末尾。因此,虽然FOR从文件系统中使用一个接一个的文件名并使用修改for %%I in ("C:\Temp\*.txt") do文件的调用jrepl.bat来处理文件,但 FAT 驱动器上的文件列表会发生变化,并且下一个目录条目在搜索时返回给FOR*.txt是刚刚修改的文件(= 无限循环),或者是跳过一个文件后的另一个文件,该文件也应该被修改,因为自FOR上次目录访问以来文件列表已更改。

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

  • call /?...还解释了%~dp0...参数0的驱动器和路径是批处理文件本身。
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • jrepl.bat /?

推荐阅读