我使用软件将我的硬盘备份到另一个硬盘。软件首先找到差异,然后将它们镜像到备份硬盘。不幸的是,它忽略了文件夹的系统属性。这是一个问题,因为许多文件夹都有修改过的图标,这些图标仅在设置了文件夹的系统属性时才显示。
为了纠正此问题,我想找到所有受影响的文件夹。这些是包含桌面.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
修饰符。