Bat-File:仅递归更改文件夹属性的命令

时间:2011-06-20 13:53:59

标签: windows batch-file directory attr

我们的网络中存在一种病毒,它将所有根目录属性设置为隐藏&系统在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首先会创建完整的文件列表然后开始处理所有事情。)

是否有可能只处理目录NOT文件而不是递归使用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 个答案:

答案 0 :(得分:4)

使用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

从您的问题中,我了解应该避免处理子目录。如果没有,请评论我的答案,我会解决它。

答案 1 :(得分:4)

所以有点晚了 - 但我们刚刚在我们的系统中遇到了同一病毒的新变种 - 进入300+文件夹共享驱动器。把所有东西都清理干净但是为了获得属性,我做了以下工作:

在文件夹中打开cmd提示符并运行: dir / A:DHS / B> FILENAME.TXT

“/ A:DHS”仅输出* D * irectory的列表,即* H * idden和* S * ystem,然后输出* B *是filename.txt

的信息

将该文件中的文件夹名称列表复制到excel列B.在A类中输入“attrib -H -S”并将其向下拖动以匹配文件夹名称数

然后在C栏中输入:= A1& “”& CHAR(34)& B1& CHAR(34)

此输出到: attrib -H -S“文件夹名称”

然后向下拖动公式以获取每个foldername的命令。将它们全部选中 - 复制 - 粘贴到记事本中 - 将文件另存为.cmd - 将文件放入出现问题的文件夹中并运行它。

这是有效的,因为它不是试图递归地做任何事情/等它只是运行命令,移动到下一行等等。花了大约3秒钟为我修复了300多个文件夹。

答案 2 :(得分:0)

我相信你不能在一个简单的批处理文件中用attrib命令做你想做的事。虽然我不熟悉它,如果这是一个严重的长期问题(病毒=我真的希望不是),你可能想看看Powershell,因为它可能提供你需要的功能(和更好的可编程性)。