Bat-File: команда для изменения атрибутов только папок не рекурсивно

В нашей сети есть вирус, который устанавливает всем корневым каталогам атрибуты hidden & system на флешках и создает 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-файлом?

Как в перле:

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

Спасибо.

-- UPD: 31.01.2012, решение:

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

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


person Sergey Vasilenko    schedule 20.06.2011    source источник
comment
Если вирус поражает только корневые каталоги, почему вы обрабатываете все файлы и каталоги?   -  person Andriy M    schedule 20.06.2011
comment
Поскольку команда attrib не может использовать фильтр, например, получать только каталоги из текущего каталога, поэтому я задал этот вопрос.   -  person Sergey Vasilenko    schedule 21.06.2011


Ответы (3)


Используйте команду 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

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

person ixe013    schedule 20.06.2011
comment
FOR /D %i IN (\*) DO … может работать так же хорошо (учитывая заявление ОП о том, что вирус поразил только корневые каталоги). - person Andriy M; 20.06.2011
comment
Да, в самом деле. Но поскольку его образец perl-скрипта открывался с «.», я заставил его работать и из текущего каталога. - person ixe013; 20.06.2011
comment
Большое спасибо. Вот и все, с небольшой поправкой: for /f %%i in ('dir /ad /ah /b') do @attrib -r -s -h %%i - person Sergey Vasilenko; 21.06.2011
comment
@Sergey: Похоже, ваше намерение состоит в том, чтобы использовать команду в пакетном сценарии, и в этом случае вы правы, это должно быть %% вместо % в ссылках на переменную цикла. Однако версия @ixe013 верна, если используется непосредственно из командной строки. Кроме того, поскольку вы собираетесь использовать команду в пакетном файле, вам, вероятно, не нужно @ перед attrib. - person Andriy M; 21.06.2011
comment
Я упоминал о необходимости использования %% в пакетном файле. Извините, что вы пропустили это. - person ixe013; 21.06.2011

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

откройте командную строку в папке и запустите: dir /A:DHS/B > имя_файла.txt

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

скопировал список имен папок из этого файла в столбец excel B. в столбце A введите «attrib -H -S» и перетащите его вниз, чтобы соответствовать количеству имен папок.

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

это выводит на: attrib -H -S "имя папки"

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

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

person micah    schedule 05.12.2012

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

person Philip Kelley    schedule 20.06.2011
comment
Я знаю, что это невозможно с атрибутом, может быть, есть возможность получить список каталогов с помощью FOR? - person Sergey Vasilenko; 20.06.2011
comment
Я думал об этом, но лучшее, что я мог придумать, это что-то очень похожее на то, что @ixe013 только что опубликовал [поддержал голос], и я полагаю, что это может быть так же медленно, как и полное сканирование, поскольку ему все равно придется проходить через каждый прямо на жесткий диск. Тем не менее, попробуйте (и чтобы мы не узнали результаты?), Посмотрите, работает ли он лучше, чем метод грубой силы. - person Philip Kelley; 20.06.2011