如何正确使用多个"for"命令

How to correctly use multiple "for" commands

好的,我已经处理这个好几天了。而且我已经一步步尝试了,但总是出问题。

我想做的是:我的全部音乐 collection 都在外部硬盘上。我想要 运行 一个批处理文件,它将:

这是我尝试过的方法(以及...的许多变体)

创建类别的临时列表..

for /f %%I in (.) do break > %%~nxI
dir /b /o:n /a:d > temp_categories.txt

为每个类别制作一个类别降价文件

for /f "delims=" %%C in (TEMP_categories.txt) do (
echo The %%C category >> %%C.md

然后我基本上做同样的事情进入每个艺术家文件夹和每个专辑。当我进入相册文件夹时,我添加...

mkdir mp3
move [/Y | /-Y] *.mp3 mp3

它一直有效,直到它进入第一类第一位艺术家的第一张专辑。它添加了 mp3 文件夹但不移动文件并且永远不会转到下一个项目。

我意识到这可能不是最好的代码。但我只需要它工作一次。否则我将需要手动完成所有操作。

@ECHO OFF
SETLOCAL
rem The following setting for the source directory is a name
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"

rem C ategories
FOR /d %%C IN ( "%sourcedir%\*") DO (
 CALL :validatecategory "%%~nxC"
 IF NOT DEFINED invalidcat (
  rem aR tists
  FOR /d %%R IN ( "%sourcedir%\%%~nxC\*") DO (
   ECHO %%~nxR>>"%%C\%%~nxC artists.md"
   rem A lbum
   FOR /d %%A IN ( "%sourcedir%\%%~nxC\%%~nxR\*") DO (
    ECHO %%~nxA>>"%%R\%%~nxR albums.md"
    MD "%%A\mp3" 2>nul
    rem T rack
    FOR %%T IN ( "%sourcedir%\%%~nxC\%%~nxR\%%~nxA\*.mp3") DO (
     ECHO %%~nxT>>"%%A\%%~nxA tracks.md"
     MOVE "%%T" "%%A\mp3" >nul
    )
   )
  )
 )
)
GOTO :EOF

:: Categories must be one character

:validatecategory
SET "invalidcat=%~1"
SET "invalidcat=%invalidcat:~1%"
GOTO :eof

请注意,%%Q 将具有完整的 file/pathname 和 %%~nxQ 名称,其中 Q 是 C:Category R:Rtist A:Album T:Track.

显然,首先针对测试子树进行测试。

请注意,我假设 .mp3 位于 Album 目录中。如果将 .mp3 移动到 MP3 目录,则进一步运行将忽略它们,因此 tracks.md 文件不应初始化为 empty,但其他 .md 文件应为已于 re-run.

删除

--- 回复评论

添加明显的附加行

ECHO %%~nxR>>"%%C\%%~nxC artists.md"
CALL :makelinksfile "%%~nxR">>"%%C\%%~nxC artists_links.md"
rem A lbum

并在任何 GOTO :EOF 行下方添加新的 :makelinksfile 例程

GOTO :eof

:: Transform spaces in artists' names (%1) to "%%20"

:makelinksfile
SET "artist=%~1"
SETLOCAL enabledelayedexpansion
ECHO !artist: =%%%%20!
endlocal
GOTO :eof

这里发生的是 artist 设置为提供的参数(艺术家姓名)并去掉了引号。

然后,setlocal enabledelayedexpansion 调用解析技巧,以便 space 在 echoed 时被 %%20 替换。