在文件中查找然后移动文件
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"
)
就覆盖现有文件而言,这是您需要决定的事情,因为我不知道您的确切情况,因此没有在移动命令中包含其他参数。
我在一个目录中有数量未知的文本文件,这些文件都是这样命名的,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"
)
就覆盖现有文件而言,这是您需要决定的事情,因为我不知道您的确切情况,因此没有在移动命令中包含其他参数。