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



好吧,我已经做了好几天了。我已经一步一步地尝试了,但总有问题。

我想做的是:我把我的整个音乐收藏放在一个外部硬盘上。我想运行一个批处理文件,它将:

  • 进入每个类别文件夹(类别是艺术家名称的第一个字母(
  • 为类别创建一个标记文件,列出该类别中的每个艺术家
  • 进入每个艺术家文件夹
  • 为艺术家创建一个标记文件,列出每个相册
  • 进入每个相册文件夹
  • 为专辑创建一个标记文件,列出每首曲目
  • 创建一个mp3文件夹,并将该相册的所有mp3移动到其中

这就是我尝试过的(以及…的许多变体(

制作一个类别的临时列表。。

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 "%%Amp3" 2>nul
rem T rack
FOR %%T IN ( "%sourcedir%%%~nxC%%~nxR%%~nxA*.mp3") DO (
ECHO %%~nxT>>"%%A%%~nxA tracks.md"
MOVE "%%T" "%%Amp3" >nul
)
)
)
)
)
GOTO :EOF
:: Categories must be one character
:validatecategory
SET "invalidcat=%~1"
SET "invalidcat=%invalidcat:~1%"
GOTO :eof

请注意,在整个过程中,%%Q将具有完整的文件/路径名,%%~nxQ将具有名称,其中Q为C:类别R:Rtist A:专辑T:Track。

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

请注意,我假设.mp3在Album目录中。如果将.MP3移动到MP3目录,则进一步的运行将忽略它们,因此tracks.md文件不应初始化为,而应在重新运行时删除其他.md文件。

---意见回复

添加明显的附加线

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

并将新的CCD_ 1例程添加到任何CCD_

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调用解析技巧,使得当空间是echo时,空间被%%20替换。

最新更新