如何创建包含至少一个给定类型

时间:2017-03-06 01:58:18

标签: batch-file

我有一个大型目录\ 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
)

...它给了我文件夹的第一个字,但也递归,所以我得到了每一章的名字(我不想要)。

  1. 如何获取-full-文件夹名称?

  2. 如何才能只搜索一个级别并返回父文件夹名称(即书名)。

2 个答案:

答案 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

如果完整文件夹名称包含空格或超量,则此方法将失败。如果需要,这一点可以修复。