在文件中查找然后移动文件

Find in file then move the file

我在一个目录中有数量未知的文本文件,这些文件都是这样命名的,ABC1200f1234.EAU,但它们都略有不同。每个文本文件的内部结构相同,但内容不同。每个文件中都有一个字符串 * SERIAL NUMBER:XXXXX *。对于每个文件,SERIAL NUMBER: 后面的 6 个字符是不同的。我正在尝试搜索每个文件以获取 SERIAL NUMBER: 之后的 6 数字,然后将该文件移动到以 6 数字命名的目录,例如如果 6 数字是 A12345 那么我想创建一个名为 A12345 的目录并将文件移动到那里,然后移动到下一个文件直到所有文件都被移动。

以下代码将 6 位数字转换为 %%a,但我仍然不知道如何移动文件,然后再移动到下一个文件。我确定我只是遗漏了一小块拼图。

@ECHO OFF
CLS
cd c\Temp

setlocal enableextensions disabledelayedexpansions
set sourcedir=c:temp
set targetdir=c:\temp\parsed

for /f "tokens=4 delims=*:" %%a in (
    'findstr /r "SERIAL NUMBER:" %sourcedir%\*'
) do (
    if exists %targetdir%\%%a (
        echo Directory already exists
    ) else mkdir %targerdir%\%%a
)
move %sourcedir%\%%a %targetdir%\%%a
)

我确定最后一行是问题,因为 %%a 现在包含 6 数字,而不是文件名。

请不要建议 Powershell,因为那不是一个选项。我还意识到我可以使用 robocopy 并删除检查以查看目标目录是否存在。

如能提供任何帮助,我们将不胜感激。

我假设此代码的序列号紧跟在冒号之后,没有白色 space 或其他需要在其前后删除的字符。

@(setlocal EnableDelayedExpansion
  ECHO OFF
  CLS
  set "sourcedir=c:\temp"
  set "targetdir=c:\temp\parsed"
  SET "FileGlob=*.EAU"
)

CALL :Main

( Endlocal
  EXIT /B
)

:Main
  FOR %%_ IN (
    "%sourcedir%\%FileGlob%"
  ) DO (
    Echo=processing "%%~_"
    FOR /F "Tokens=2 delims=:" %%F IN ('
      TYPE "%%~_" ^| FIND /I "SERIAL NUMBER:"
    ') DO (
      ECHO=Found. Serial number "%%F" trimmingbany spaces
      FOR /F "Tokens=*" %%f IN ("%%~F") DO (
        ECHO=Trimmed serial number "%%~f" stored
        SET "_TmpFolder=%%F"
      )
    )
    MD "%TargetDir%\!_TmpFolder!\"
    MOVE "%%~_" "%TargetDir%\!_TmpFolder!\%%~nx_"
  )
GOTO :EOF

无需测试您尝试创建的目录是否存在。只需执行 mkdir 并将输出通过管道传输到 nul

注意! 此示例假定 Serial Number 在文件中单独占一行,因为您没有显示文本文件的实际示例。

@echo off
set "source=c:\temp"
set "target=c:\temp\parsed"
for %%a in ("%source%\*.EAU") do for /f "tokens=2* delims=:" %%i in ('type "%%~a" ^|findstr /i "serial number"') do (
    mkdir "%target%\%%i">nul 2>&1
    move "%%~a" "%target%\%%i"
)

就覆盖现有文件而言,这是您需要决定的事情,因为我不知道您的确切情况,因此没有在移动命令中包含其他参数。