Bat-File: Команда для изменения только атрибутов папок не рекурсивно - PullRequest
2 голосов
/ 20 июня 2011

В нашей сети есть вирус, который устанавливает все атрибуты корневых каталогов скрытыми и системными на USB-флешках и создает lnk-файлы, которые запускают cmd.exe, сам вирус и затем открывают каталоги, поэтому для лечения таких дисков я используюкоманды:

attrib -s -h -r /d /s
del /q /s *.lnk
rd /q /s recycler

Но есть проблема: команда "attrib -s -h -r / d / s" рекурсивно обрабатывает все файлы и каталоги, и если их много, это занимает слишком много времени (похоже, Windows сначала создает полный список файлов, а затем начинает обрабатывать все).

Есть ли возможность обрабатывать только файлы, а не каталоги, а не рекурсивно с помощью bat-файла?

Как в perl:

opendir D, '.';
while($_ = readdir D){
    if(-d $_){
        #do something
        }
    }
closedir D;

Спасибо.

- UPD: 2012-01-31, решение:

for /f "delims=" %i in ('dir /ad /ah /b') do @attrib -r -s -h -a "%i"

(заменить% i на %% i наиспользовать в пакетных файлах)

Ответы [ 3 ]

4 голосов
/ 20 июня 2011

Используйте команду FOR с выходом DIR в качестве рабочего списка.

Например, вы начинаете с этого:

attrib /s /d
   SHR     C:\a\a.1
   SHR     C:\a\a.2
   SHR     C:\a\a.3
   SHR     C:\a
   SHR     C:\b
   SHR     C:\c
   SHR     C:\d
A          C:\x.txt
A          C:\y.txt
A          C:\z.txt

Где a, b, c и d являются каталогами, а a имеет подкаталоги. Введите эту команду (не забудьте использовать %%, если вы вставили в пакетный файл):

for /f %i in ('dir /ad /ah /b') do @attrib -r -s -h %i

Что даст вам то, что вы хотите:

attrib /s /d
   SHR     C:\a\a.1
   SHR     C:\a\a.2
   SHR     C:\a\a.3
           C:\a
           C:\b
           C:\c
           C:\d
A          C:\x.txt
A          C:\y.txt
A          C:\z.txt

Из вашего вопроса я понимаю, что обработки подкаталогов следует избегать. Если нет, прокомментируйте мой ответ, и я исправлю его.

4 голосов
/ 05 декабря 2012

Итак, немного поздно, но у нас только что появился новый вариант того же вируса, который попал в наши системы - он попал в общую папку на 300 с лишним папок.очистил все, но чтобы вернуть атрибуты, я сделал следующее:

, откройте приглашение cmd в папке и запустите: dir / A: DHS / B> filename.txt

the "/ A: DHS "выводит список только * D * иректорий, которые * H * и * S *, затем выводит * B * - информация для filename.txt

скопировал список имен папок из этого файла в столбец Excel в столбце A, введите "attrib -H -S" и перетащите его вниз, чтобы соответствоватьколичество имен папок

, затем в столбце C введите: = A1 & "" & CHAR (34) & B1 & CHAR (34)

, что приводит к: attrib -H -S "имя папки "

, затем просто перетащите формулу вниз, чтобы получить команду для каждого имени папки.выберите их все - скопируйте - вставьте в блокнот - сохраните файл в формате .cmd - поместите файл в папку, в которой возникла проблема, и запустите ее.

Это работает, потому что он не пытается делать что-либо рекурсивно / etc, он просто запускает команду, переходит на следующую строку и так далее.Мне потребовалось около 3 секунд, чтобы исправить более 300 папок для меня.

0 голосов
/ 20 июня 2011

Я считаю, что вы не можете делать то, что хотите, с помощью команды attrib в простом пакетном файле.Хотя я не знаком с ним, если это серьезная и долговременная проблема (вирус = я действительно надеюсь, что нет), вы можете захотеть взглянуть на Powershell, поскольку он может обеспечить необходимую вам функциональность (и лучшую программируемость).

...