我在一个名为ABC1200f1234.EAU
的目录中有未知数量的文本文件,但它们都略有不同。每个文本文件的内部结构相同,但内容不同。在每个文件中都有一个字符串* SERIAL NUMBER:XXXXX *
。对于每个文件,SERIAL NUMBER:
后面的6
字符是不同的。我试图搜索每个文件,以获得SERIAL NUMBER:
后面的6
数字,然后将该文件移动到以6
数字命名的目录中,例如,如果6
数字是A12345
,那么我想创建一个名为A12345
的目录,并将该文件移到那里,然后移到下一个文件,直到所有文件都被移动为止。
下面的代码将6
的数字转换为%%a
,但在转到下一个文件之前,我一直不知道如何移动文件。我确信我只是遗漏了其中的一小部分。
@ECHO OFF
CLS
cd cTemp
setlocal enableextensions disabledelayedexpansions
set sourcedir=c:temp
set targetdir=c:tempparsed
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
并删除检查目标目录是否存在。
如果您能提供任何帮助,我们将不胜感激。
对于这段代码,我假设序列号直接在冒号后面,没有空格或其他需要在其前后删除的字符。
@(setlocal EnableDelayedExpansion
ECHO OFF
CLS
set "sourcedir=c:temp"
set "targetdir=c:tempparsed"
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:tempparsed"
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"
)
就覆盖现有文件而言,这是您需要决定的事情,因为我不知道您的确切情况,所以没有在move命令中包含其他参数。