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

2024-03-13

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

Wrong.

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

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

etc...

我被告知要手动列出 Windows 资源管理器中的每个文件夹,然后将每个文件夹丝网打印到 Word 文档中。

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

我对 Windows 命令行不太熟悉,但相信有 for 循环?使用其中一个并以某种方式循环遍历各个级别是否可以成为一种解决方案?有解决办法吗? (哦,我多么希望有一个解决方案!)。

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


-Edit 1-

我一直在命令行上阅读各种网页,虽然我仍然不理解 For /f 命令,但我遇到了 popd 和 Pushd,它们允许您将当前目录存储在虚拟堆栈上。由于我的问题是我需要以某种方式修改 dir 命令的行为,以便它按级别列出文件夹,而不是遵循明显的文件夹结构,我想知道是否有任何方法可以使用 Pushd 和 popd 来执行此操作?

使用 dir 命令使我能够将文件删除,留下目录列表(dir *./s /b),但这仍然尝试遵循结构,在我的示例 dir * 中。 /s /b 给出 -

E:\动物
E:\城市
E:\植物
E:\动物\鸟类
E:\动物\哺乳动物
E:\动物\爬行动物
E:\城市\大陆
E:\城市\大陆\非洲
E:\城市\大陆\欧洲
E:\城市\大陆\北美
E:\植物\花卉
E:\植物\草
E:\植物\树木

我需要以某种方式获得具有相同级别数分组的所有目录 - 因此将 E:\plants\xxxx 的目录移动到 E:\Cities\Continents 下面。我不知道我是否更接近解决方案,对 dir /s /b 的输出进行排序不起作用,因此看起来我必须以某种方式解析 dir /s /b 的输出。


-编辑2-

如果我用高级语言(而不是批处理文件)执行此操作,我会获取 dir /s /b 的输出并将变量 -say x - 设置为 1。然后我会运行 dir 输出并将其中包含 x \ 的所有行复制到新文件中。在 eof 处,我会增加 x 并再次运行该文件(这次 x 为 2,它将选出所有包含 2 \ 的行)。我将继续这样做,直到没有行中有 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

一些使用的“技巧”:

  • Your find /c方法失败,因为它不是查找出现的情况,而是查找带有搜索字符串的行(一行中是否有一个或多个结果并不重要)
  • I used dir的开关/ad仅显示目录。
  • 为了计数,我使用for循环(对于每个单词,计数器加一)
  • 因此,我首先从字符串中删除空格,然后替换每个\有一个空格。
  • 从 100 而不是 0 开始计数可能听起来很奇怪,但它使代码能够处理深度 > 10 (sort对字符串进行排序,所以4将大于12)
  • 遗憾的是,我必须使用临时文件(管道确实重新启用echo on)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐