批量删除用户文件夹,不包括某些用户文

时间:2018-03-29 13:10:00

标签: batch-file

我尝试创建一个批处理文件,删除C:\users下30天以前的用户个人资料,但我想排除部分用户。在我的情况下,我想要排除marcadministrator

有谁知道我做错了什么?

以下是批处理文件的代码:

@echo on
:: set folder path
set dump_path=c:\Users

:: set min age of files and folders to delete
set max_days=30

:: user profiles that don't have to be deleted
set marc=marc
set administrator=administrator

:: remove files from %dump_path%
for /d %%i in (%dump_path%\*) do (
   if /I not "%%i" == "%dump_path%\%Marc%" (
         if /I not "%%i" == "%dump_path%\%Administrator%" (
            forfiles -p %dump_path% -m *.* -d -%max_days% -c "cmd  /c del /q @path"
            forfiles -p %dump_path% -d -%max_days% -c "cmd /c IF @isdir == TRUE rd /S /Q @path"
        ) else (
            Echo Can't delete %%i
        )
    ) else (
        Echo Can't delete %%i
    )
)

:: forfiles -p %dump_path% -m *.* -d -%max_days% -c "cmd  /c del /q @path"

:: remove sub directories from %dump_path%
:: forfiles -p %dump_path% -d -%max_days% -c "cmd /c IF @isdir == TRUE rd /S /Q @path"

1 个答案:

答案 0 :(得分:1)

主要的错误是这个想法。对于每个用户帐户,Windows注册表中存在数据,例如用户帐户的GUID,用于安全组中用于访问NTFS分区,Windows注册表,网络上的目录和文件的用户配置文件...因此只需删除用户帐户的配置文件目录是可能的,但实际上不是一个好主意。

但是,此批处理文件可用于此任务:

@echo off
if not "%~1" == "" goto DeleteFolder
%SystemRoot%\System32\forfiles.exe /P "C:\Users" /D -30 /C "%SystemRoot%\System32\cmd.exe /C if @isdir == TRUE "%~f0" @path"
goto :EOF

:DeleteFolder
for %%I in ("marc" "administrator") do if /I "%~nx1" == "%%~I" goto :EOF
echo rd /Q /S %1

批处理文件首先检查它是否以参数启动。此批处理文件的初始启动没有任何参数,导致执行命令 FORFILES ,然后退出批处理文件。

命令 FORFILES 在目录C:\Users中搜索超过30天的文件和目录。对于符合此条件的每个文件或文件夹,执行Windows命令解释程序时,选项/C将在完成指定命令的执行后关闭。

启动的Windows命令解释程序首先运行 IF 条件,以检查 FORFILES 的当前项是否完全是目录。只有在这种情况下,批处理文件才会再次启动,启动Windows命令解释程序,当前目录的路径超过30天,用双引号括起来。

因此,批处理文件的第二个实例检测到它是以参数启动的,因此会跳转到标签DeleteFolder

有一个简单的 FOR 循环,其中两个双引号字符串可以使用更多字符串进行扩展。对于括号内的每个字符串, FOR 执行 IF 条件。

IF 条件将不区分大小写的循环的当前字符串与传递给批处理文件的参数的最后一个反斜杠后的字符串进行比较。因此比较的是没有C:\Users\的文件夹路径和列表中的当前字符串。

如果比较的字符串相等,则退出 FOR 循环和批处理文件执行。

否则,如果C:\Users中超过30天的目录与任何字符串都不匹配,则命令 RD 以递归方式静默删除该目录,如果不存在则执行命令 ECHO 左命令 RD 只输出此命令行。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cmd /?
  • echo /?
  • for /?
  • forfiles /?
  • goto /?
  • if /?

另见Where does GOTO :EOF return to?