【问题标题】:Batch file to delete C:\users\*name* except for specified folders批处理文件删除 C:\users\*name* 指定文件夹除外
【发布时间】:2019-07-16 17:53:31
【问题描述】:

我正在尝试编写一个批处理文件来删除 c:\users 中的所有文件夹,但有一些例外。

场景: 我们在一个库中有多台共享 PC,用户可以登录并且不再使用。这通常会用用户配置文件填满 c:\ 驱动器。

我想从 c:\users 中删除除 c:\users\defaultuser0 和 c:\users\public 之外的所有文件夹。

希望这是有道理的? 我看过其他一些问题/答案,但它们只指定如何指定 1 个文件夹。 另外,我知道 delprof,因为我们确实在其他应用程序中使用它,但我想编写自己的文件,以便针对这种情况进行修改。

【问题讨论】:

  • 从这里开始:*.com/questions/16078421/…
  • 简单地删除目录不是执行此任务的正确方法。系统中仍会保留有关这些配置文件的信息,因此虽然您可以释放 HDD 空间,但您仍然会有许多现在无效的对不再存在的位置的引用。您在问题中提到了旧的 DelProf 实用程序,除非您使用的是 Windows 10,否则可能更喜欢非官方的 DelProf2 实用程序,它是可编写脚本的,忽略特殊配置文件,并且也可以选择排除命名配置文件。

标签: batch-file


【解决方案1】:

TL;DR:

wmic /namespace:\\root\cimv2 path win32_userprofile where "SID LIKE 'S-1-5-21%' AND NOT LocalPath LIKE '%-Admin' AND NOT LocalPath LIKE '%\\ToolBox'" delete

详情:

在我的脑海中,我将问题从“删除所有文件夹”翻译为“删除所有用户配置文件”。如果那是错的,请随时击败我。 :-)

我最近有一个项目,我需要做同样的事情,我使用了上面的解决方案。需要注意的是,Windows 不会删除处于活动状态且当前加载到内存中的配置文件——我认为这是一件好事。在这些情况下,一旦系统重新启动,配置文件将不再加载,“DELETE”调用将正常工作。这不仅会删除目录和文件,还会执行典型的配置文件清理工作。

请注意 - 我知道这是多余的,但由于这会删除配置文件,这意味着保存在配置文件中的文件也可以/将被删除。您可能希望在被删除之前备份文件。

查看和报告

wmic /namespace:\\root\cimv2 path win32_userprofile where "SID LIKE 'S-1-5-21%' AND NOT LocalPath LIKE '%-Admin' AND NOT LocalPath LIKE '%\\ToolBox'" get LocalPath,LastUseTime,SID

寻找和毁灭

wmic /namespace:\\root\cimv2 path win32_userprofile where "SID LIKE 'S-1-5-21%' AND NOT LocalPath LIKE '%-Admin' AND NOT LocalPath LIKE '%\\ToolBox'" delete

【讨论】:

    【解决方案2】:

    您可以备份要保留的文件夹,删除所有文件夹,然后最后将备份文件夹移回该位置,这是一个示例:

    @echo off
    md c:\folderbackup
    copy c:\users\defaultuser0 c:\folderbackup\defaultuser0
    copy c:\users\public c:\folderbackup\public
    del /f /q c:\users\*.*
    move c:\folderbackup\defaultuser0 c:\users\defaultuser0
    move c:\folderbackup\public c:\users\public
    rd c:\folderbackup
    

    如果显示Access Denied,请尝试以管理员身份运行。

    【讨论】:

    • 移动所有这些文件夹会使系统混乱,这是建议的。
    【解决方案3】:

    如果您仍然想删除目录,不同意我的建议,我建议像这样从批处理文件中使用WMIC

    @For /F "Tokens=1*Delims==" %%A In ('WMIC Path Win32_UserProfile Where "Special!='True' And LocalPath Is Not Null And Not LocalPath Like '%%\\defaultuser0'" Get LocalPath /Value 2^>Nul')Do @For /F "Tokens=*" %%C In ("%%B")Do @RD/S/Q "%%C"
    

    如果您更喜欢Net User 方法,我仍然建议从批处理文件中使用WMIC,如下所示:

    @For /F Tokens^=2^Delims^=^" %%A In ('WMIC Path Win32_UserProfile Where^
     "Special!='True' And LocalPath Is Not Null" Assoc^
     /AssocClass:Win32_UserAccount 2^>Nul')Do @For /F "Tokens=1*Delims==" %%B In ('
        WMIC UserAccount Where^
     "SID='%%A' And LocalAccount='TRUE' And Name!='defaultuser0'" Get Name /Value^
     2^>Nul')Do @For /F Tokens^=* %%D In ("%%C")Do @Net User "%%D" /Delete
    

    使用 WMI 检索用户帐户路径和/或名称比仅选择默认位置和用户原始名称的目录更加健壮

    【讨论】:

      【解决方案4】:

      您似乎误解了什么是用户配置文件以及用户是什么。即使您从C:\Users\username 删除他们的文件夹,仍然会保留一些信息,如Compo here 所述,例如在您安装在C:\Program Files*\*C:\Windows\* 等的某些程序中。如果您只删除用户配置文件目录,信息不会丢失

      然而,为了实现你想要的,虽然不推荐搞砸你的系统,使用(以管理员权限运行):

      @echo off
      setlocal EnableDelayedExpansion
      
      set exclude_list="defaultuser0" "public"
      
      for /F "delims= eol=" %%A IN ('dir /B /AD "C:\Users\"') do (
          if "!exclude_list:%%A=!" == "%exclude_list%" (rd /s /q "%%~fA")
      )
      
      echo Cleared the unneeded folders in C:\Users^^! Folders remaining:
      dir /b "C:\Users\"
      

      删除用户的命令正式在cmdnet user username /delete中。为此,请执行以下操作:

      @echo off
      setlocal EnableDelayedExpansion
      
      set exclude_list="defaultuser0" "public"
      
      for /F "delims= eol=" %%A IN ('dir /B /AD "C:\Users\"') do (
          if "!exclude_list:%%A=!" == "%exclude_list%" (net user %%~nxA /delete)
      )
      

      请注意,在这两种情况下,添加 quoted 一个您要排除的文件夹名称。

      有关所用命令的更多信息,请尝试查看 cmd 中以下命令的帮助页面:

      • echo /?
      • setlocal /? 已启用,因为我们无法执行 %exclude:%%A=%% 太多。
      • set /?
      • for /?
      • if /?
      • rd /?
      • net user /?

      一些有趣的链接参考供进一步阅读:

      【讨论】: