如果您真的想坚持使用显然无法正确处理属性的备份工具,您可以使用以下代码基于重新应用包含文件的所有目录的属性: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
匹配目录(注意尾随\
)。
无论如何,也许您应该切换到另一个可以正确处理所有属性的备份工具,例如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