批处理文件可根据文件名将文件移动到文件夹

时间:2019-02-25 21:10:43

标签: batch-file

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

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

我有名为TEST1_City1TEST2 City2 ...

的文件夹

我需要将文件TEST1_2018P2.xlsx移至文件夹TEST1_City1,将TEST2_2018P2.xslx移至TEST2 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

2 个答案:

答案 0 :(得分:1)

我不确定您要执行的任务是什么,因此,这个相对简单的示例应将任何.xlsx文件移至名称与文件名部分匹配的第一个现有目录,直到下划线,再加上一个空格。 / p>

调整行23上的值以匹配您的实际目录规范(不带反斜杠)

@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 "%~1" Move /Y "%~1" "%%A" 2>Nul
Exit /B

它并非设计为执行任务的最有效方法!

答案 1 :(得分:0)

假定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,不包括所有目录(/A-D和标头。使用delims=eol=选项:遍历整行,而不会跳过以;开头的行。
  • 第二个for /F循环用于获取第一个循环(IN ("%%A"))的输出的第一个标记。
    • 第一个标记设置为token_1变量,然后减去它的最后一个数字/字母,将其设置为num_test变量。
    • 设置文件夹名称是因为它被两次使用,如果不将其设置为变量,则很难理解该代码。实际上,它是由token_1变量(TESTn),_Cityn(数字)设置的。
    • 使用该名称创建一个文件夹。 STDIN和STDERR都重定向到nul。碰巧没有太多处理过的if exist语句。当前文件(%%~fA;完整路径)已移至该文件夹。

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