如何设置包含desktop.ini的每个文件夹的系统属性?

时间:2017-07-31 15:40:03

标签: batch-file cmd attributes windows-10 desktop.ini

我使用软件将我的硬盘备份到其他硬盘。软件首先找到差异然后将它们镜像到备份HDD。不幸的是,它忽略了文件夹'系统属性。这是一个问题,因为很多文件夹都有修改过的图标,只有当文件夹出现时才会显示。系统属性已设置。

要解决此问题,我想找到所有受影响的文件夹。这些是包含desktop.ini文件的文件,因此系统属性应设置为此类文件夹。

我知道如何设置文件夹的系统属性,但我不知道如何以有条件的方式递归执行:

D:\>attrib +s ExampleDirectory

我想我需要一个Windows批处理脚本,但我不确定,因为我对批处理编程一无所知。

1 个答案:

答案 0 :(得分:1)

如果您真的想要坚持使用显然无法正确处理属性的备份工具,您可以使用基于for /D /R的以下代码重新应用System属性包含文件Desktop.ini的目录:

for /D /R "D:\path\to\root\dir" %%D in ("*") do (
    if exist "%%~D\Desktop.ini" (
        if not exist "%%~D\Desktop.ini\" (
            attrib +S "%%~D"
        )
    )
)

两个嵌套的if语句需要对包含名为System的文件的目录应用Desktop.ini属性,但不包含那些包含该名称的目录的目录(尽管这可能发生的可能性很小);第一个if条件匹配文件和目录,第二个not匹配目录(请注意尾随\)。

无论如何,也许您应该切换到另一个可以正确处理所有属性的备份工具,例如robocopycomment推荐的。{/ p>

上述方法无法正确处理隐藏项,因为for /D无法识别隐藏目录,attrib不会更改隐藏文件的系统属性。为了克服这个问题,代码需要像这样修改:

for /F "delims=" %%D in ('dir /B /S /A:D "D:\path\to\root\dir\*"') do (
    if exist "%%~D\Desktop.ini" (
        if not exist "%%~D\Desktop.ini\" (
            set "HIDDEN=%%~aD"
            setlocal EnableDelayedExpansion
            if not "!HIDDEN!"=="!HIDDEN:h=!" (
                endlocal
                attrib -H "%%~D"
                attrib +H +S "%%~D"
            ) else (
                endlocal
                attrib +S "%%~D"
            )
        )
    )
)

这会使用for变量引用的~a modifiersub-string replacement