重命名文件以查找文件中的字符串

时间:2018-05-04 20:12:02

标签: batch-file batch-processing

我正在尝试根据文件中的String重命名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

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

此致 汤姆

2 个答案:

答案 0 :(得分:1)

@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 匹配""的文件中的行(每个行 - 甚至是空的)和/n对方括号内的行进行编号。 for/f使用find[作为分隔符读取]输出的每一行,因此行号显示为第一个"令牌"进入%%h,行内容作为第二个标记(%%i)。

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

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

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

答案 1 :(得分:0)

PowerShell脚本,更改推送路径以适合您的环境

## Q:\Test\2018\05\04\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行(基于零)
  • 获取最后一个元素并从空格和双引号中修剪它
  • 在其间添加空格并附加扩展名
  • 最后重命名。