我有一个大型目录\ books。
在该目录中有许多子目录。其中一些子目录包含MP3。
我希望能够打印文件夹包含至少一个MP3的每个文件夹名称的列表。
另一个需要注意的是,其中一些文件夹本身包含用户为每个文章创建子目录的子目录。例如:
\mybook
\chapter1
\chapter2
..etc...
因此脚本需要检查文件夹中是否存在MP3,或者再向下调整一个子级别,然后如果找到MP3,则打印父文件夹名称并退回。
我希望所有这些都是有道理的。我知道如何使用“真正的”编程语言来完成这项工作,但我在DOS批处理中难倒。
我走得很远,放弃了。
@echo off
for /F %%i in ('dir /s/b "g:\books\*.mp3"') do (
echo %%i
)
...它给了我文件夹的第一个字,但也递归,所以我得到了每一章的名字(我不想要)。
如何获取-full-文件夹名称?
如何才能只搜索一个级别并返回父文件夹名称(即书名)。
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%a IN (
'dir /b /ad "%sourcedir%\*" '
) DO (
IF EXIST "%sourcedir%\%%a\*.mp3" (ECHO %%a
) ELSE (
SET "found="
FOR /f %%m IN (
'dir /b /ad "%sourcedir%\%%a\*"'
) DO IF NOT DEFINED found IF EXIST "%sourcedir%\%%a\%%m\*.mp3" (
SET found=y
ECHO %%a
)
)
)
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
for/f
会将第一个标记分配给元变量。默认分隔符包含空格,因此使用"delims="
选项关闭分隔符将传递整行。
所以 - 外部循环:获取源目录中所有目录名(/b
)的基本形式(/ad
)的目录列表;依次将每个分配给%%a
。
如果目录包含文件名* .mp3,请报告,否则
内循环:设置"未找到"状态;同一笔交易 - 在%%a
中查找%%m
的子目录名称,如果所需文件存在,则报告并标记"找到"如果%%a
的多个子目录包含所需的文件名,则阻止进一步报告的状态。
答案 1 :(得分:0)
@echo off
setlocal
rem Accumulate .mp3 files in folders one level below "books" one
cd /D g:\books
for /D %%d in (*) do (
for /F %%i in ('dir /s/b "%%d\*.mp3"') do (
set /A folder[%%~Pd]+=1
)
)
rem Show results
for /F "tokens=2,3 delims=[]=" %%a in ('set folder[') do echo %%a = %%b .mp3 files
如果完整文件夹名称包含空格或超量,则此方法将失败。如果需要,这一点可以修复。