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



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

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

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

D:>attrib +s ExampleDirectory

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

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

for /D /R "D:pathtorootdir" %%D in ("*") do (
if exist "%%~DDesktop.ini" (
if not exist "%%~DDesktop.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:pathtorootdir*"') do (
if exist "%%~DDesktop.ini" (
if not exist "%%~DDesktop.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修饰符。

最新更新