【问题标题】:Windows CMD or BATCH file that "flags" empty folders (and folders that only contain empty folders)“标记”空文件夹(以及仅包含空文件夹的文件夹)的 Windows CMD 或 BATCH 文件
【发布时间】:2016-04-04 14:10:01
【问题描述】:

我工作过的大多数公司都使用模板文件夹结构开始新项目。 Windows 将自动标记空文件夹(文件资源管理器中显示的图标是空文件夹的图标),但是,子文件夹也为空的文件夹不会被标记(它们的图标显示包含文件的文件夹)。这可能会在项目的早期阶段造成混乱并导致错误,因为乍一看,某些文件夹实际上只包含空的子文件夹时添加了内容。

所以我的问题是:

如何遍历具有空子文件夹的文件夹并通过使用批处理文件“标记”它们。

.bat 文件需要搜索子文件夹以确定文件夹是否有任何真实内容。如果文件夹没有实际内容,则 .bat 文件需要对其进行标记(可以通过更改其图标或文件名来完成标记)。这将使导航具有大型模板文件夹结构的新项目变得更加容易。

我不需要完整的文件,我只想知道如何实现。但是,我们非常欢迎任何有关如何实现此功能的提示或建议!

*编辑

为了澄清,我将举一个例子: 如果我创建一个名为“Project”的空文件夹,它将显示 Empty Folder 图标。如下图:

现在我将在我的项目文件夹中添加一个名为“I am Empty”的新文件夹:

文件夹“项目”不再显示 空文件夹 图标。它现在使用显示内容的图标。如下图:

我想要的是一个 .bat 文件,它将解析“Project”文件夹的内容并确定它只包含“I am Empty”文件夹,该文件夹是空的并“标记”该文件夹(标记它我们可以将“项目”文件夹的图标改回 Empty Folder 图标,更改名称或“将其变灰”)。如下图:

【问题讨论】:

  • “Windows 将自动标记空文件夹” - 我不明白,你在这里想说什么。当我创建一个空文件夹时,Windows 不会做任何事情。它只是文件系统中的另一个文件夹。
  • 对,我要标记包含空文件夹的文件夹...
  • 如果 PowerShell 是一个选项,您可以让您的生活变得更轻松(请参阅Windows PowerShell Tip of the Week: Finding All the Empty Folders in a Directory Tree)。我还是不太明白你所说的“flag”是什么意思。如果你解释得更好一点,可能会让你的问题更清楚。或者完全忽略它,因为这与您的问题无关:识别所有空目录。
  • 我只是添加了一些比单独的文字更能说明问题的例子。另外,在我最初的问题中,我声明:(标记可以通过更改其图标或文件名来完成)。因此,如果无法更改图标。我也可以使用 .bat 文件将文件夹从“项目”重命名为“项目(空)”。
  • 你所谓的 "flagging" 并归因于 Windows 实际上是文件资源管理器的详细信息窗格的一个功能。它既与 Windows 无关,也不是分配给目录的属性,也不是您可以分配给文件夹的属性。如果你想自定义资源管理器的显示,一个 .bat 文件是不行的。您必须实现一个 shell 扩展(我认为 Preview Handler,但我对此并不完全确定)。

标签: windows batch-file cmd filesystems


【解决方案1】:
cd example
for /d %%i in (*) do @dir /b /s /a-d "%%i">nul 2>&1|| @echo "%%i" has no files

如果您还想检查子文件夹,请给 for 一个额外的 /r

诀窍是仅列出文件夹和所有子文件夹 (/s) 中的文件 (/a-d),如果失败 (||)(因为没有文件),请使用此文件夹(只需echo 在这里,但rd /s /qren 也可以)

【讨论】:

    【解决方案2】:

    基于 Stephan 给出的答案并查看其他相关的堆栈交换帖子,我将这个解决方案拼凑在一起,它可以很好地满足我的需求:

    @ECHO OFF
    PUSHD "%~dp0"
    FOR /f "tokens=* delims=" %%F in ('dir /b/s/ad  *') DO (
        @dir /s /a-d-s "%%F">nul 2>&1|| ATTRIB +H "%%F"
        @dir /s /a-d-s "%%F">nul 2>&1&& ATTRIB -H "%%F"
    )
    POPD 
    EXIT
    

    我选择了不修改文件名的解决方案。在测试这种方法时,我意识到它并不能创造最好的用户体验。

    相反,运行此批处理文件会隐藏实际上为空的文件夹,如果您的文件夹设置允许您查看隐藏的文件夹,那么它们会显示为淡出。它还会重新显示自上次运行批处理文件以来具有新内容的隐藏文件。

    对于那些像我一样对批处理脚本相对缺乏经验的人来说。我将解释代码的作用和原因(据我了解)。

    我不想更改每个实现的批处理文件,所以我调用PUSHD "%~dp0 将活动目录设置为包含批处理文件的文件夹(这让我可以在文件夹结构模板中包含批处理文件,其中为每个项目复制和粘贴)

    因为我决定使用 hidden 属性来标记文件夹,所以我需要修改 FOR 循环。 FOR 循环通常会忽略隐藏文件,如果您需要显示以前隐藏的文件,因为它有新内容,这会变得很麻烦。运行FOR /f "tokens=* delims=" %%F in ('dir /b/s/ad *') DO () 允许批处理文件循环遍历所有文件,主要是因为 /f 属性,但检查 this post about looping through hidden folders 了解更多信息。

    在 for 循环中,我几乎按照 Stephen 在他的回答中提出的建议进行了操作,并添加了逻辑来删除不再需要的文件夹上的隐藏属性。

    这个批处理文件唯一缺少的是在文件夹修改时自动更新或在文件夹打开时自动运行的能力(我听说这可能通过 .ini 文件实现?)但是,根据我的需要,它会更改文件夹后手动重新运行批处理文件就足够了。

    就脚本语言而言,批处理脚本远远超出了我的舒适范围,因此,如果我犯了任何错误,或者如果有更可靠的方法来做我需要的事情,请原谅并纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多