【问题标题】:Creating a batch file to rename TXT files based on content (removing inappropriate syntax)创建批处理文件以根据内容重命名 TXT 文件(删除不适当的语法)
【发布时间】:2023-12-16 22:37:01
【问题描述】:

我正在尝试创建一个批处理文件,它允许我根据测试文件本身中的文本重命名文件夹中的所有文件。我已经粘贴了以下文本的前四行:

09-Nov-16  07:50 AM                              HAND-HELD DRIVER REPORT                                              PAGE:  1 
                                             XYZ COMPANY - AR1    

    DATE > 11/09/16    DRIVER > 1010    DRIVER NAME > Mike Smith TRUCK > 4719

我正在尝试为每个文件夹命名 DATE-DRIVER NAME-TRUCK。我还需要在日期字段中删除“/”。任何帮助都将不胜感激!

【问题讨论】:

  • 我只看到两行。
  • 我已重新格式化数据 - 请检查是否正确。要格式化,请选择要发布的信息并按{}
  • 所以你对第四行感兴趣,想在>符号后面使用各自的字符串,对吧?您能否提供来自给定示例文本文件的派生名称?请澄清您要重命名的内容 - 文件或文件夹(您提到了两者)。并请分享您自己的解决方法!

标签: batch-file for-loop rename


【解决方案1】:
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%x IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 SET "oldname=%%x"
 SET "newname="
 SET "drivname="
 REM detect a line with 4 ">"
 REM Process only the first found in a file
 FOR /f "usebackqtokens=1-5delims=>" %%a IN (
  "%%x") DO IF NOT DEFINED newname IF "%%e" neq "" (
  REM process date into %%i, %%j, %%k
  FOR /f "tokens=1-3delims=/ " %%i IN ("%%b") DO (
   REM build drivname
   CALL :procname %%d
   REM build new filename and rename file
   CALL :build %%k %%i %%j %%e
  )
  IF NOT DEFINED newname ECHO %%x NOT renamed
 )
)

GOTO :EOF

:procname
IF "%2"=="" GOTO :EOF
SET "drivname=%Drivname% %1"
shift
GOTO procname

:build
IF NOT DEFINED drivname GOTO :EOF
SET "newname=%1%2%3-%drivname:~1%-%4"
IF /i "%oldname%" neq "%newname%" (
 ECHO(REN "%sourcedir%\%oldname%" "%newname%"
)
GOTO :eof

您需要更改sourcedir 的设置以适应您的情况。

所需的 REN 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(REN 更改为REN 以实际重命名文件。

比较简单:

将每个文件名处理为%%x。使用该文件名,查找包含 4 > 的行当找到该行时(%%e 将非空)然后日期将在 %%b,因此将其解析为 %%i,j,k 并处理名称+ %%d 中的 TRUCK 字符串。最后,一起构建元素 - %%k 中的年,%%i 中的月份,%%j 中的日,%%e 中的卡车编号和 %drivname% 中的驱动程序名称。

:build 例程确保drivname 存在,并根据提供的参数和drivname 构建新文件名。如果新旧名称相同(不区分大小写),则重命名会产生错误(文件之前已处理过),因此请跳过重命名。由于newname是在:build例程中建立的,所以一旦发生重命名,就不会重复。

最后,如果没有设置newname,那么文件没有得到所需格式的行,所以报告这个事实。

【讨论】:

    【解决方案2】:

    这是我的尝试,更改 BaseFld 以适应您的环境

    @Echo off
    Set BaseFld=Q:\Test\2016-11\10\
    Set Files=*.txt
    PushD %BaseFld%
    
    For %%A in (%Files%) Do For /f "tokens=2-5 delims=>" %%B IN (
      'findstr "DATE.*DRIVER.*DRIVER.NAME.*TRUCK" "%%~fA"'
        ) Do Call :Rename "%%~A" "%%B" "%%C" "%%D" "%%E"
    PopD
    Goto :Eof
    
    :Rename
    : Parse Date to yyMMdd
    For /F "Tokens=1-3 Delims=/ " %%F in (%2) Do Set _YMD=%%H%%F%%G
    For /F %%F in (%3) Do Set _DriverNo=%%F
    Set _DriverName=%~4
    Set _DriverName=%_DriverName: TRUCK=%
    Set /A _TruckNo=%~5
    Set "NewName=%_YMD%%_DriverName: =-%%_TruckNo%%~x1"
    If /i "%~nx1" neq "%NewName%" Echo Ren %1 "%NewName%"
    

    结果

    Ren "Test.txt" "161109-Mike-Smith-4719.txt"
    

    编辑要真正重命名最后一行中的回声,必须删除。包含一个 if 以防止重命名已处理的文件。

    【讨论】:

    • @Rory 编辑了批处理并添加了删除回声的提示。如果您发现批次有用,您可以检查答案和/或投票。干杯。