Как установить системный атрибут каждой папки, содержащей desktop.ini?

Я использую программное обеспечение для резервного копирования моего жесткого диска на другой жесткий диск. Программное обеспечение сначала находит различия и затем отражает их на резервный жесткий диск. К сожалению, он игнорирует системные атрибуты папок. Это проблема, потому что многие папки имеют измененные значки, которые отображаются, только если установлены системные атрибуты папок.

Чтобы исправить это, я хочу найти все затронутые папки. Это файлы, которые содержат файл desktop.ini, поэтому для таких папок должны быть установлены системные атрибуты.

Я знаю, как установить системный атрибут папки, но я не знаю, как сделать это рекурсивно, условно:

D:\>attrib +s ExampleDirectory

Думаю, мне понадобится пакетный скрипт для Windows, но я не уверен, так как ничего не знаю о пакетном программировании.

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, который был рекомендован комментарием.


Вышеупомянутый подход не обрабатывает скрытые элементы правильно, потому что 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"
            )
        )
    )
)

Это использует ~a модификатор for ссылка на переменную и замена подстроки.

Другие вопросы по тегам