0

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

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

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

D:\>attrib +s ExampleDirectory

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

4

1 回答 1

1

如果您真的想坚持使用显然无法正确处理属性的备份工具,您可以使用以下代码基于重新应用包含文件的所有目录的属性:for/D /RSystemDesktop.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匹配目录(注意尾随\)。

无论如何,也许您应该切换到另一个可以正确处理所有属性的备份工具,例如robocopy,这已被评论推荐。


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

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"
            )
        )
    )
)

这利用了变量引用和子字符串替换的~a修饰符for

于 2017-07-31T16:38:27.353 回答