我使用软件将我的硬盘备份到其他硬盘。软件首先找到差异然后将它们镜像到备份HDD。不幸的是,它忽略了文件夹'系统属性。这是一个问题,因为很多文件夹都有修改过的图标,只有当文件夹出现时才会显示。系统属性已设置。
要解决此问题,我想找到所有受影响的文件夹。这些是包含desktop.ini文件的文件,因此系统属性应设置为此类文件夹。
我知道如何设置文件夹的系统属性,但我不知道如何以有条件的方式递归执行:
D:\>attrib +s ExampleDirectory
我想我需要一个Windows批处理脚本,但我不确定,因为我对批处理编程一无所知。
答案 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
匹配目录(请注意尾随\
)。
无论如何,也许您应该切换到另一个可以正确处理所有属性的备份工具,例如robocopy,comment推荐的。{/ 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
modifier和sub-string replacement。