如何正确使用多个"for"命令
How to correctly use multiple "for" commands
好的,我已经处理这个好几天了。而且我已经一步步尝试了,但总是出问题。
我想做的是:我的全部音乐 collection 都在外部硬盘上。我想要 运行 一个批处理文件,它将:
- 进入每个类别文件夹(类别是艺术家姓名的第一个字母)
- 为类别创建一个降价文件,列出类别中的每个艺术家
- 进入每个艺术家文件夹
- 为列出每张专辑的艺术家创建一个降价文件
- 进入每个相册文件夹
- 为列出每首曲目的专辑创建降价文件
- 创建一个 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 "%%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 在 echo
ed 时被 %%20
替换。
好的,我已经处理这个好几天了。而且我已经一步步尝试了,但总是出问题。
我想做的是:我的全部音乐 collection 都在外部硬盘上。我想要 运行 一个批处理文件,它将:
- 进入每个类别文件夹(类别是艺术家姓名的第一个字母)
- 为类别创建一个降价文件,列出类别中的每个艺术家
- 进入每个艺术家文件夹
- 为列出每张专辑的艺术家创建一个降价文件
- 进入每个相册文件夹
- 为列出每首曲目的专辑创建降价文件
- 创建一个 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 "%%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 在 echo
ed 时被 %%20
替换。