Windows "flags" 个空文件夹(以及仅包含空文件夹的文件夹)的 CMD 或 BATCH 文件

Windows CMD or BATCH file that "flags" empty folders (and folders that only contain empty folders)

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

所以我的问题是:

How can I iterate over folders with empty subfolders and "flag" them via the use of a Batch file.

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

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

*编辑

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

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

的新文件夹

文件夹 'Project' 不再显示 空文件夹 图标。它现在使用显示内容的图标。如下图:

我想要的是一个 .bat 文件,它将解析 'Project' 文件夹的内容并确定它只包含 'I am Empty' 文件夹,该文件夹是空的 "flag"文件夹(要标记它,我们可以将 'Project' 文件夹的图标更改回 空文件夹 图标,更改名称或 "gray it out")。如下图:

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 也是可能的)

根据 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 将活动目录设置为包含批处理文件的文件夹(这让我可以将批处理文件包含在文件夹中-结构模板,为每个项目复制和粘贴)

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

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

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

就脚本语言而言,批处理脚本远远超出了我的舒适范围,所以如果我犯了任何错误或有更可靠的方法来完成我需要的工作,请原谅并纠正我。