【问题标题】:Bat-File: Command to change only folders attributes not recursivelyBat-File:仅更改文件夹属性而不是递归的命令
【发布时间】:2011-09-18 17:33:39
【问题描述】:

我们的网络中有一种病毒,它在 USB 闪存驱动器上设置所有根目录属性隐藏和系统,并创建运行 cmd.exe、病毒本身然后打开目录的 lnk 文件,所以为了治愈这些驱动器,我使用命令:

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 以在批处理文件中使用)

【问题讨论】:

  • 如果病毒只影响根目录,为什么要处理所有文件和目录?
  • 因为attrib命令不能使用像“只从当前目录获取目录”这样的过滤器,这就是我问这个问题的原因。

标签: windows batch-file directory attr


【解决方案1】:

有点晚了——但我们的系统刚刚感染了同一种病毒的新变种——进入了一个包含 300 多个文件夹的共享驱动器。把所有东西都清理干净了,但为了找回属性,我做了以下操作:

在文件夹中打开 cmd 提示符并运行: 目录 /A:DHS /B > 文件名.txt

"/A:DHS" 仅输出 *D* 目录的列表,即 *H*idden 和 *S *系统,然后输出 *B*are info 到 filename.txt

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

然后在 C 列中输入:=A1 & " " & CHAR(34) & B1 & CHAR(34)

这输出到: attrib -H -S "文件夹名"

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

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

【讨论】:

    【解决方案2】:

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

    根据您的问题,我了解应避免处理子目录。如果没有,请评论我的答案,我会修复它。

    【讨论】:

    • FOR /D %i IN (\*) DO … 可能也能正常工作(鉴于 OP 声明病毒仅攻击根目录)。
    • 是的,确实如此。但由于他的示例 perl 脚本打开了 '.',我也让它在当前目录下工作。
    • 非常感谢。稍加修正就是这样: for /f %%i in ('dir /ad /ah /b') do @attrib -r -s -h %%i
    • @Sergey:您的意图似乎是在批处理脚本中使用该命令,在这种情况下您是正确的,它应该是%%,而不是引用循环变量的%。但是,如果直接从命令提示符使用,@ixe013 的版本是正确的。另外,由于您打算在批处理文件中使用该命令,您可能不需要在attrib 之前使用@
    • 我确实提到需要在批处理文件中使用 %% 。很抱歉你错过了。
    【解决方案3】:

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

    【讨论】:

    • 我知道,attrib 是不可能的,也许有可能用 FOR 获取目录列表?
    • 我想到了这一点,但我能想到的最好的东西很像 @ixe013 刚刚发布的 [upvoted],我认为它可能和“全面扫描”一样慢,因为它仍然必须直接在硬盘驱动器上遍历所有内容。不过,试一试(以免我们知道结果?),看看它是否比蛮力方法执行得更好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2015-11-22
    • 2019-11-09
    • 2011-04-19
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多