我正在尝试根据文件中的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
我感谢能得到的任何帮助。提前谢谢。
此致 汤姆
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
生成定义为%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行的first
和second
中的字符串。由于每一行由一系列以逗号分隔的字符串组成,而逗号是一个分隔符,因此变量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
$txtFile