有谁能帮我解决这个问题?我有一些音乐文件夹,标签如下“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 个部分,但您可以轻松自行扩展。每个部分应与其他部分之间用一个空格隔开。文件夹名称不应以破折号开头或结尾,也不应包含多个破折号。