我该怎么做呢 ? - 按级别生成目录列表 - 而不是按以下结构

How do I do this ? - Producing a Dir listing by level - not by following structure

我希望你能在这里拯救我的理智。我被要求生成一份报告,显示 windows 服务器上的所有文件和文件夹。不是你会认为有问题 - dir /s > report.txt 你做对了吗?

错了。

我被告知报告必须按级别而不是文件夹结构。解释。想象一下我们有一个这样布置的服务器 -

E:
├───Animals
│   ├───Birds
│   ├───Mammals
│   └───Reptiles
├───Cities
│   └───Continents
│       ├───Africa
│       ├───Europe
│       └───North America
└───Plants
    ├───Flowers
    ├───Grasses
    └───Trees

Dir /s 会产生 -

Directory of E:
23/11/2017  11:57    <DIR>          .
23/11/2017  11:57    <DIR>          ..
23/11/2017  11:46    <DIR>          Animals
23/11/2017  11:51    <DIR>          Cities
23/11/2017  11:52    <DIR>          Plants

               0 File(s)            0 bytes

 Directory of E:\Animals

23/11/2017  11:46    <DIR>          .
23/11/2017  11:46    <DIR>          ..
23/11/2017  11:47    <DIR>          Birds
23/11/2017  11:49    <DIR>          Mammals
23/11/2017  11:50    <DIR>          Reptiles

               0 File(s)              0 bytes

 Directory of E:\Animals\Birds

23/11/2017  11:47    <DIR>          .
23/11/2017  11:47    <DIR>          ..
23/11/2017  11:47                 0 Duck.txt
23/11/2017  11:47                 0 Ostrich.txt
23/11/2017  11:47                 0 Pigeon.txt

               3 File(s)              0 bytes

 Directory of E:\Animals\Mammals

23/11/2017  11:49    <DIR>          .
23/11/2017  11:49    <DIR>          ..
23/11/2017  11:48                 0 Aardvark.txt
23/11/2017  11:48                 0 cat.txt
23/11/2017  11:48                 0 dog.txt

               3 File(s)              0 bytes

 Directory of E:\Animals\Reptiles

23/11/2017  11:50    <DIR>          .
23/11/2017  11:50    <DIR>          ..
23/11/2017  11:49                 0 Iguana.txt
23/11/2017  11:50                 0 Sand Lizard.txt

               2 File(s)              0 bytes

等等

但他们想要 -

Directory of E:

23/11/2017  11:57    <DIR>          .
23/11/2017  11:57    <DIR>          ..
23/11/2017  11:46    <DIR>          Animals
23/11/2017  11:51    <DIR>          Cities
23/11/2017  11:52    <DIR>          Plants

               0 File(s)            0 bytes

Directory of E:\Animals

23/11/2017  11:46    <DIR>          .
23/11/2017  11:46    <DIR>          ..
23/11/2017  11:47    <DIR>          Birds
23/11/2017  11:49    <DIR>          Mammals
23/11/2017  11:50    <DIR>          Reptiles

               0 File(s)              0 bytes

Directory of E:\Cities

23/11/2017  11:51    <DIR>          .
23/11/2017  11:51    <DIR>          ..
23/11/2017  11:51    <DIR>          Continents

               0 File(s)              0 bytes

Directory of E:\Plants

23/11/2017  11:52    <DIR>          .
23/11/2017  11:52    <DIR>          ..
23/11/2017  11:51    <DIR>          Flowers
23/11/2017  11:51    <DIR>          Grasses
23/11/2017  11:51    <DIR>          Trees

               0 File(s)              0 bytes

等...

有人告诉我在 windows 资源管理器中手动列出每个文件夹,然后将每个文件夹丝网打印到 word 文档中。

我是什么意思!???有超过 14,000 个文件夹!我做了什么值得这个?!我是在夜里死去而没有注意到吗?地狱不应该是充满火焰和拿着干草叉四处游荡的家伙吗??

我不太熟悉 windows 命令行,但相信有 for 循环吗?使用其中之一并以某种方式遍历关卡是否可以解决问题?有解决办法吗? (哦,我多么希望有一个解决方案!)。

请有人把我从永恒的丝网印刷地狱中拯救出来!


-Edit 1-

I have been reading the various web pages on the command line, and while I still do not understand the For /f command I have come across popd and pushd, which allow you to store the current directory on a virtual stack. Since my problem is that I need to somehow modify the behaviour of the dir command so that it lists folders by level and not by following the obvious folder structure I'm wondering if there is any way that I can use pushd and popd to do this?

Playing with the dir command has enabled me to strip the files out to be left with a list of directories (dir *. /s /b) but this still tries to follow the structure, in My example dir *. /s /b gives -

E:\Animals
E:\Cities
E:\Plants
E:\Animals\Birds
E:\Animals\Mammals
E:\Animals\Reptiles
E:\Cities\Continents
E:\Cities\Continents\Africa
E:\Cities\Continents\Europe
E:\Cities\Continents\North America
E:\Plants\Flowers
E:\Plants\Grasses
E:\Plants\Trees

I need to somehow get all the directories with the same number of levels grouped - so move the E:\plants\xxxx ones to below E:\Cities\Continents . I have no idea if I am any nearer a solution, sorting the output of dir /s /b does not work so it looks like I am going to have to somehow parse the output of dir /s /b.


-编辑 2 -

如果我使用高级语言而不是批处理文件来执行此操作,我将获取 dir /s /b 的输出并将变量 - 比如 x - 设置为 1。然后我会 运行 通过 dir 输出并将其中包含 x \'s 的任何行复制到新文件中。在 eof 处,我将再次通过文件递增 x 和 运行(这次 x 为 2,它将挑选出所有包含 2 \'s 的行)。我会继续这样做,直到没有行中有 x \'s,这会给我一个包含所需顺序的文件。然后我会 运行 通过新文件为每个条目执行一个简单的目录。

问题是我不知道如何在批处理文件中执行上述操作 - 或者即使它可能并且我无法访问该项目的高级语言。我什至认为他们不会让我使用 Word vb 以及我在任何情况下进行任何 Visual Basic 编程以来的岁月。

@echo off 
setlocal enabledelayedexpansion

(for /f "delims=" %%a in ('dir /b /s /ad') do (
  set "line=%%a"
  set "line=!line:\= !"
  set depth=100
  for %%b in (!line!) do set /a "depth +=1"
  echo !depth!#%%a
)) >temp
for /f "tokens=1* delims=#" %%a in ('sort temp') do echo %%b

一些用过的 "tricks":

  • 你的 find /c 方法失败了,因为它没有找到事件,而是与搜索字符串匹配(一行中是否有一个或多个结果并不重要)
  • 我使用 dir 的开关 /ad 只显示目录。
  • 为了计数,我使用了一个 for 循环(每个单词将计数器加一)
  • 因此,我首先从字符串中删除 spaces,然后将每个 \ 替换为 space。
  • 从 100 而不是 0 开始计数可能听起来很奇怪,但它使代码能够处理深度 > 10(sort 对字符串进行排序,因此 4 将大于 12)
  • 遗憾的是,我必须使用临时文件(管道重新启用 echo on