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

时间:2016-04-04 14:10:02

标签: windows batch-file cmd filesystems

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

所以我的问题是:

  

如何迭代具有空子文件夹的文件夹和" flag"他们通过使用批处理文件。

.bat文件需要搜索子文件夹以确定文件夹是否包含任何真实内容。如果文件夹没有真实内容,则.bat文件需要标记它(标记可以通过更改其图标或文件名来完成)。这样可以更轻松地导航具有大型模板化文件夹结构的新项目。

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

*编辑

只是为了澄清我将展示一个例子: 如果我创建一个名为' Project'的空文件夹。它将显示空文件夹图标。如下图所示:

enter image description here

现在我要在我的项目文件夹中添加一个新文件夹,名为'我是空的':

enter image description here

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

enter image description here

我想要的是一个.bat文件,它将解析'项目'的内容。文件夹,并确定它只包含'我是空的'文件夹,为空,"标记"该文件夹(为了标记它我们可以将'项目'文件夹的图标更改回空文件夹图标,更改名称或"灰显" )。如下图所示:

enter image description here

2 个答案:

答案 0 :(得分:2)

cd example
for /d %%i in (*) do @dir /b /s /a-d "%%i">nul 2>&1|| @echo "%%i" has no files
如果您想检查子文件夹,请

for一个额外的/r

诀窍是仅列出文件夹中的文件(/a-d)和所有子文件夹(/s),如果失败(||)(因为没有文件),请执行此操作这个文件夹的内容(这里只有echo,但rd /s /qren也是可能的)

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

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

在for循环中,我几乎正在做Stephen在他的回答中建议的添加逻辑,删除不再需要它的文件夹上的隐藏属性。

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

批处理脚本在我的舒适区域之外就脚本语言来说是如此,如果我犯了任何错误或者有更可靠的方法来做我需要的话,请原谅并纠正我。