根据部分文件名创建文件夹并将文件移动到创建的文件夹中

Create Folders based on part of file name and move files into the created folder

我绝对不是开发人员,我需要您的帮助。我环顾了这个站点,发现了一些我认为可以满足我的需求但实际上不起作用的例子。 First example 或另一个 Second Exapmle 我创建了这个测试批处理文件:

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\Test_Directory"
PUSHD %sourcedir%
FOR /f "tokens=1* delims=-" %%a IN (
 'dir /b /a-d "*.pb*"'
 ) DO (  
 ECHO MD %%a
 ECHO MOVE "%%a-%%b" .\%%a\
)
POPD
GOTO :EOF

我为测试目的创建了以下文件:

我有一个分隔符“-”。我需要创建一个文件夹,其名称与 3 个字符定界符之前的名称相同,并将所有以与定界符之前相同的名称开头的文件移动到该文件夹​​。

现在第一个问题是'delims'只接受一个字符。有了3我该怎么办?

第二个问题是在一些文件中这个模式“-”不存在。然后必须将文件移动到名为“0-TBC”的目录中。

第三个问题是当我的文件名中只有一个“-”字符时,它与我要查找的模式不匹配。在那种情况下,我应该找到模式,如果它不在文件名中,那么文件也应该移动到“0-TBC”文件夹中。

第四个问题是,当我运行上面的批处理文件时,显示的结果很好(除了它没有解决上面的两个问题)。然而,当我删除 'MD' 命令前面的 'ECHO' 时,它会将 SPACE 作为分隔符而不是 '-' 字符,因此它绝对不会按预期执行要做。

抱歉拖了这么久。非常感谢您的帮助。

您可以将字符串 SPACE + - + SPACE 替换为单个字符串文件名中不能出现的字符,如 |,例如:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Change into root directory:
pushd "C:\Test_Directory" && (
    rem // Loop through all matching files:
    for /F "delims= eol=|" %%F in ('
        dir /B -A:-D-H-S "*.pb*"
    ') do (
        rem // Store current file name:
        set "FILE=%%F"
        rem // Toggle delayed expansion to avoid troubles with `!`:
        setlocal EnableDelayedExpansion
        rem // Replace ` - ` by `|` and split file names there:
        for /F "tokens=1* delims=| eol=|" %%I in ("!FILE: - =|!") do (
            endlocal
            rem // Check file name:
            if "%%J"=="" (
                rem // File name contains no ` - `:
                ECHO md "0-TBC" 2> nul
                ECHO move "%%F" "0-TBC\"
            ) else (
                rem // File name does contain `|`:
                ECHO md "%%I" 2> nul
                ECHO move "%%F" "%%I\"
            )
        )
    )
    rem // Return from root directory:
    popd
)

endlocal
exit /B