批处理脚本获取文件夹名称的第一部分和第二部分并从中创建新文件夹

批处理脚本获取文件夹名称的第一部分和第二部分并从中创建新文件夹

有谁能帮我解决这个问题?我有一些音乐文件夹,标签如下“Taylor Swift - 1989”等,文件夹中只有音乐文件和文件夹图像。

我需要批处理脚本的帮助,该脚本获取文件夹名称的第一部分,即(Taylor Swift),并使用该部分名称创建一个新文件夹,然后将原始文件夹移动到其中,将其重命名为文件夹名称的第二部分,即(1989)

举个例子:一个名为“taylor swift - 1989”的文件夹,通过分隔“-”创建一个新文件夹,该文件夹将变为“taylor swift”,然后将原始文件夹移动并重命名为标记为“1989”的子文件夹,并且所有音乐文件都将位于该文件夹中。

我已经尝试过这个脚本,但我不知道如何切换名称和文件夹,所有的移动似乎都是正确的。

@echo off 

cd /d "%~dp0"
setlocal enabledelayedexpansion

for /d %%i in ("* - *") do 2>nul (

     echo\ & set "_Folder=%%~i"
     echo\Folder found: ...\!_Folder:*\=!
     cd /d "%~dp0!_Folder:*- =!\." ) && 2>nul ( 
     echo\Folder "!_Folder:*- =!" exists... & cd.. ) || 2>nul (
     echo\Folder: ...\!_Folder:*- =! does not exist, creating...
     mkdir "%~dp0!_Folder:*- =!" & echo\Moving file ..\!_Folder:*- =! to folder !_Folder:*- =! 
     move "%%~fi" "%CD%\!_Folder:*- =!" && echo\Moving file "%%~nxi" to folder "..\!_Folder:*- =!".. 
     
    ) 
    )
    
echo\Finished & %__APPDIR__%timeout.exe -t 60 & endlocal && goto=:EOF

答案1

@echo off & cd /d "%~dp0"

for /f delims^= %%i in =;(' dir /a:-a /b "* - *"
    ');= do for /f usebackq^tokens^=1*delims^=-^" %%G in =;(`
         set /p "'=%%~nxi"^<nul `);= do call %:^) "%%~G" "%%~H" "%%~dpnxi"

%:^)
if not "%~1" == "" =;(
     set "_dir=%~1" & set "_sub=%~2"
     call rename "%~3" "%%_sub:~1%%"
     call mkdir "%cd%\%%_dir:~0,-1%%"
     call move "%%_sub:~1%%" "%%_dir:~0,-1%%" 
     );= & exit /b 

1.通过使用以下方式过滤出现次数来列出文件夹*Space-Space*循环中:

for /f delims^= %%i in (' dir /a:-a /b "* - *" ') do ....

2.直接进入第二个循环,分离文件夹名称中出现的字符串发生在之前 “-” 发生在之后并获取完整路径文件夹:


 for /f usebackq^tokens^=1*delims^=-^" %%G in (`set /p "'=%%~nxi"^<nul `) do ... "%%~G" "%%~H" "%%~dpnxi"

3.调用标签来处理组成接下来命令的子文件夹名称所需的子字符串


 for /f ... (`...`) do call %:^) "%%~G" "%%~H" "%%~dpnxi"

4.在函数内部,使用 set variable=susbtrings 来编写文件夹名称和其他命令:

@echo off

...
...
...
 
%:^)
if not "%~1" == "" =;(
     set "_dir=%~1" & set "_sub=%~2"
        ...      "%~3" "%%_sub:~1%%"
        ...      "%cd%\%%_dir:~0,-1%%"
        ...      "%%_sub:~1%%" "%%_dir:~0,-1%%" 
     );= & exit /b

5.取名称“ numeric”,删除名称“ artists”之前和“ year”之后的空格,完成后,将当前文件夹重命名为年份,为名称创建文件夹,然后将年份文件夹从文件夹中移出artist

     call rename "%~3" "%%_sub:~1%%"
     call mkdir "%cd%\%%_dir:~0,-1%%"
     call move "%%_sub:~1%%" "%%_dir:~0,-1%%"

答案2

谢谢巴伦德

正如您所说,这是有效的,我必须扩展它以包含更长的艺术家和专辑名称。

我不太清楚自己在做什么,但经过反复尝试,最终得到了这样的结果

SETLOCAL ENABLEDELAYEDEXPANSION

for /f "usebackq tokens=1-20" %%a in (`dir /A:D /B *-*`) do (
    set full=%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%b==- set name=%%a & set year=%%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%c==- set name=%%a %%b & set year=%%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%d==- set name=%%a %%b %%c & set year=%%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%e==- set name=%%a %%b %%c %%d & set year=%%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%f==- set name=%%a %%b %%c %%d %%e & set year=%%g %%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%g==- set name=%%a %%b %%c %%d %%e %%f & set year=%%h %%i %%j %%k %%l %%m %%n %%o %%p
    if %%h==- set name=%%a %%b %%c %%d %%e %%f %%g & set year=%%i %%j %%k %%l %%m %%n %%o %%p
    
    if not exist "!name!" mkdir "!name!"
    rename "!full!" "!year!"
    move "!year!" "!name!"
)

答案3

好吧,我又想了想,得出了以下结论。请不要再要求更多了,其他语言确实更适合做这样的事情。

我还没有进行过广泛的测试,我将把测试留给你。这个例子应该可以让你开始。

SETLOCAL ENABLEDELAYEDEXPANSION

for /f "usebackq tokens=1-5" %%a in (`dir /A:D /B *-*`) do (
    set full=%%a %%b %%c %%d %%e
    if %%b==- set name=%%a & set year=%%c %%d %%e
    if %%c==- set name=%%a %%b & set year=%%d %%e
    if %%d==- set name=%%a %%b %%d & set year=%%e
    
    if not exist "!name!" mkdir "!name!"
    rename "!full!" "!year!"
    move "!year!" "!name!"
)

这将循环遍历名称中包含破折号且没有扩展名的所有文件夹。我假设文件夹名称最多包含 5 个部分,但您可以轻松自行扩展。每个部分应与其他部分之间用一个空格隔开。文件夹名称不应以破折号开头或结尾,也不应包含多个破折号。

相关内容