Batch file 批量删除用户文件夹(不包括某些用户文件夹)

Batch file 批量删除用户文件夹(不包括某些用户文件夹),batch-file,Batch File,我正在尝试创建一个批处理文件,以删除C:\users下超过30天的用户配置文件,但我想排除一些用户。在我的例子中,我想排除marc和administrator 有人知道我做错了什么吗 以下是批处理文件的代码: @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 ha

我正在尝试创建一个批处理文件,以删除
C:\users
下超过30天的用户配置文件,但我想排除一些用户。在我的例子中,我想排除
marc
administrator

有人知道我做错了什么吗

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

@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"

主要的错误是这个想法。对于每个用户帐户,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天,并用双引号括起来

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

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

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

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

否则,如果超过30天的
C:\Users
中的目录与任何字符串都不匹配,则将执行递归且安静地删除目录的命令RD,如果没有命令ECHO只输出此命令行

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • cmd/?
  • echo/?
  • 获取/?
  • forfiles/?
  • goto/?
  • 如果/?

另请参见

非常感谢,我非常清楚,现在我明白我做错了什么