首页 > 解决方案 > 通过在文件中查找字符串来重命名文件

问题描述

我正在尝试根据文件中的字符串重命名 2000 个 txt 文件。我一直在查看这些链接,但完全不知道从哪里开始。

根据内容中的多个字符串重命名文本文件 sublime text- "list lines contains 'find' string

在txt 文件的第56行,字符串将始终显示为: A30,765,0,1,1,2,N,"4596"

在txt 文件的第66行,字符串将始终显示为: B60,867,0,3,3,8,220,N,"7731853555"

我想将所有文件批量重命名为引号中的任何内容。因此,对于此示例,我希望将文件名重命名为:

4596 7731853555.txt

我很感激我能得到的任何帮助。提前致谢。

问候,汤姆

标签: batch-filebatch-processing

解决方案


@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 SET "filename=%%a"
 FOR /f "tokens=1*delims=[]" %%h IN ('find /v /n "" "%sourcedir%\%%a"') DO (
  IF "%%h"=="56" SET "first=%%i"
  IF "%%h"=="66" SET "second=%%i"&CALL :rentxt
 )
)
)>"%outfile%"

GOTO :EOF

:rentxt
FOR %%p IN (%first%) DO SET "part1=%%~p"
FOR %%p IN (%second%) DO SET "part2=%%~p"
ECHO REN "%sourcedir%\%filename%" "%part1% %part2%.txt"
GOTO :eof

您将需要更改设置sourcedirdestdir适应您的情况。

生成定义为 %outfile% 的文件

嗯 - 我很无聊,所以几分钟的轻松...

为了方便起见,我将目录和文件的名称设置为变量 - 以测试我的u:驱动器上的过程。

如所写,代码应生成它打算在命名为 的文件中执行的重命名命令列表outfile。这使您可以检查文件以确定文件中的数据是否存在任何错误(使得第 56/66 行不遵循所描述的形式)而不采取行动。

要在测试准确性完成后实际重命名ECHO文件,只需删除该行中的关键字ECHO REN...。这将执行实际的重命名,而不是简单地报告它。该报告随后无关紧要,因此可以将(之前的单行for...%%a...与该)>"%outfile%"行一起删除。

首先,for...%%a执行*.txt源目录中文件的目录列表,并将找到的文件名依次分配给%%a. 和开关产生一种基本(仅名称)格式并分别抑制找到的目录名称/b/a-d

find搜索文件中/v匹配的行(将是每一行 - 甚至是空行)并在方括号内对行进行编号。读取输出的每一行,使用和作为分隔符,因此行号显示为第一个“标记” ,而行内容显示为第二个标记 ( )。""/nfor/ffind[]%%h%%i

然后选择第 56 行和第 66 行分成单独的变量,并注意其中filename包含土豆。

当找到第 66 行时,我们调用子程序分别处理第56 行和第 66 行中:rentxt的字符串。由于每一行都由一系列逗号分隔的字符串组成,而逗号是分隔符,因此变量会依次分配给这些字符串中的每一个,因此循环以分配给的最后一个变量结束。方便地删除任何封闭的引号。firstsecondpart*forpart*~

然后,由于我们现在将行的部分和原始文件名安全地保存在变量中,我们需要做的就是构建重命名指令,以及 -echo它用于验证,或者echo删除后,重命名文件。


推荐阅读