编写批处理脚本以根据内容中找到的两个字符串重命名文件名

问题描述 投票:0回答:1

我的目录中有多个

Invoice_Term1........txt
文件,例如
Invoice
。每个文件的内容包含:

Invoice No : B23335 ...  
Account Code : ABDU16 ...

如何循环遍历每个txt文件

FINDSTR Invoice No : 
,但复制
B23335
FINDSTR Account Code : 
,然后复制
ABDU16

问题是每个

Invoice No
Account Code
的字符长度不同,并且数字和代码字符串后面还有其他单词,(在我上面的示例内容中表示为
...
,与其之间用空格分隔性格。

目的是使用上面的示例将文件重命名为

Invoice_Term1.......B233335_ABDU16.txt

我尝试使用人工智能,但肯定需要大量更改,甚至完全重写。

@ECHO OFF
FOR %%F IN (*.txt) DO (
    FINDSTR /R /C:"Invoice No :" /C:"Account Code :" \"%%F\" > temp.txt
    SET /P KEYWORD1=<temp.txt
    SET /P KEYWORD2=<temp.txt
    FOR /F "tokens=3 delims= " %%A IN ("%KEYWORD1%") DO (
        FOR /F "tokens=3 delims= " %%B IN ("%KEYWORD2%") DO (
            REN \"%%F\" %%A%%B.txt
        )
    )
    DEL temp.txt
)

我需要一些专家的帮助。

batch-file file-rename
1个回答
0
投票
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following setting for the directory is a name
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"

PUSHD "%sourcedir%"

FOR /f %%e IN ('dir /b /a-d *.txt') DO (
 FOR /f "usebackqtokens=1-4" %%g IN ("%%e") DO (
  IF /i "%%g%%h%%i"=="InvoiceNo:" SET "Inv=%%j"
  IF /i "%%g%%h%%i"=="AccountCode:" SET "Account=%%j"
 )
 ECHO REN "%%e" "%%~ne!Inv!_!Account!.txt"
)

popd

GOTO :EOF

注意

Invoice No : B23335
位于前文件中,而
B233335
位于所需的新名称中(一个额外的
3
- 推测是拼写错误)

指定

......
的形式很重要,因为存在例如。文件名中的空格可能会影响处理它所需的代码。

请注意,将文件重命名为 samefilenameplusextracharacters.ext 可能会导致

for…(mask)…
重新处理该文件。
for /f…('dir…
方法首先在内存中构建文件列表,然后处理该文件列表。

切换目录[pushd]

dir /b /a-d
生成仅包含文件名的列表。

从文件中读取每一行,将前 3 个标记对接起来,例如:

Invoice
No
:
用于测试并获取变量的第四个标记(使用默认分隔符)。

切换回原目录[popd]

所需的 REN 命令仅出于测试目的而进行

ECHO
编辑。 验证命令正确后,将
ECHO REN
更改为
REN
以实际重命名文件。

© www.soinside.com 2019 - 2024. All rights reserved.