繁体   English   中英

批处理文件根据文件名的一部分将文件移动到文件夹

[英]Batch File to move files to folders base on part of their name

我正在寻找一种解决方案,它可以帮助我将文件移动到名称相似的文件夹中。

我有像TEST1_2018P2.xlsxTEST2_2018P2.xslx等文件名。

我有名称为TEST1_City1TEST2 City2文件夹...

我需要的是将文件TEST1_2018P2.xlsx移动到文件夹TEST1_City1TEST2_2018P2.xslxTEST2 City2等等。

我怎样才能做到这一点?

这是我的最新代码,它也不起作用。

@ECHO OFF
SETLOCAL
SET "sourcedir=my_folder"
SET "destdir=my_folder"
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*.xlsx" ' ) DO (
    FOR /f "tokens=1delims=" %%b IN ("%%a") DO (
        FOR /f "delims=" %%d IN ( 'dir /b /ad "%destdir%\*%%b*" ' ) DO (
            ECHO(MOVE "%%a" "%destdir%\%%d\"
        )
    )
)
GOTO :EOF

我不确定您的确切任务,因此这个相对基本的示例应该将任何.xlsx文件移动到第一个现有目录,其名称与文件名的下划线部分相匹配,并加上一个空格。

调整第2行和第3行的值以匹配您的实际目录规范(不带尾随反斜杠)

@Echo Off
Set "SourceDir=my_folder"
Set "DestDir=my_folder"
For /F Delims^=^ EOL^= %%A In ('Dir /B/A-D-L "%SourceDir%\*_*.xlsx" 2^>Nul'
) Do Call :Sub "%%A"
GoTo :EOF

:Sub
Set "DirName=%~1"
Set "DirName=%DirName:_="&:"%"
For /F Delims^=^ EOL^= %%A In ('Dir /B/AD-L "%DestDir%\%DirName% *" 2^>Nul'
) Do If Exist "%SourceDir%%~1" Move /Y "%SourceDir%\%~1" "%DestDir%\%%A" 2>Nul
Exit /B

它不是设计为执行任务的最有效方法!

另请注意,您现有的目录名称没有明确的模式,因此这是为TEST1 City1 TEST2 City2等编写的。如果它们都是下划线,例如TEST1_City1 TEST2_City2等, TEST1_City1 TEST2_City2更改"%DestDir%\\%DirName% *" 11"%DestDir%\\%DirName%_*" 如果目录可以是其中之一,并且您确定没有两个目录以字符串TEST1TEST2等开头(在这种情况下,这将限制您只能使用数字 0..9),您可能可以使用"%DestDir%\\%DirName%?*"作为替代方法位于第11行。

假设TEST1实际文本不包含任何_字符,您可以使用:

@echo off
setlocal EnableDelayedExpansion

cd /d "your_folder"
for /F "delims= eol=" %%A IN ('dir /B /A-D "TEST*_2018P2.xlsx"') do (
    for /F "tokens=1 delims=_" %%B IN ("%%A") do (
        rem Define some important variables:
        set "token_1=%%B"
        set "num_test=!token_1:~-1!"
        set "foldername=!token_1!_City!num_test!"
        md "!foldername!\" >nul 2>&1
        move "%%~fA" "!foldername!\"
    )
)

让我解释一下我的代码:

  • 第一个for /F循环用于查找您想要的所有文件 ( TEST*_2018P2.xlsx ),不包括所有目录 ( /AD )和标题。 delims=eol=选项:遍历整行而不跳过以;开头的行; .
  • 第二个for /F循环用于获取第一个循环( IN ("%%A") )输出的第一个标记。
    • 第一个标记设置为token_1变量,然后token_1减去最后一个数字/字母,将其设置为num_test变量。
    • 设置文件夹名是因为它被使用了两次,如果不将它设置在变量中,很难理解这段代码。 它实际上是由token_1变量 ( TESTn )、 _Cityn (number) 设置的。
    • 将创建一个具有该名称的文件夹。 STDIN 和 STDERR 都被重定向到nul if exist语句,这恰好没有处理很多。 当前文件( %%~fA ;完整路径)被移动到这个文件夹。

请记住将"your_folder"替换为您的实际文件夹!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM