通过在文件中查找字符串重命名文件

Renaming Files from finding a string within the file

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

Rename text files based on multiple strings in their contents sublime text- "list lines containing 'find' string

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

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

我想将所有文件批量重命名为引号内的任何内容。所以对于这个例子,我希望文件名重命名为:

4596 7731853555.txt

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

此致, 汤姆

@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 REN... 行中的 ECHO 关键字即可。这将执行实际重命名而不是简单地报告它。该报告随后变得无关紧要,因此 for...%%a... 之前的单个 ( 行可以与 )>"%outfile%" 行一起删除。

首先,for...%%a对源目录下的*.txt个文件进行目录列表,依次将找到的文件名赋值给%%a/b/a-d 开关生成基本(仅名称)格式并抑制分别找到的目录名称。

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

然后select第56行和第66行变成单独的变量,注意filename包含土豆。

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

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

PowerShell 脚本,更改 Pushd 路径以适应您的环境

## Q:\Test18\SO_50182439.ps1
Pushd "X:\path\to\files"

Get-ChildItem *.txt | ForEach-Object {
    $txtFile = Get-Content $_
    If ($txtFile.Count -ge 66){
       $NewName = $txtfile[55].split(',')[-1].Trim().Trim('"')+" "+
                  $txtfile[65].split(',')[-1].Trim().Trim('"')+$_.Extension
       $_ | Rename-Item -NewName $NewName
    }
}
PopD

  • 脚本迭代 txt 文件,将内容读入 var $txtFile
  • 检查内容至少有 66 行
  • 在逗号处拆分第 55 行和第 65 行(从零开始)
  • 获取最后一个元素并将其从 space 和双引号
  • 中删除
  • 在中间加上 space 并附加扩展名
  • 终于重命名了。