2012-06-24 33 views
0

好吧,我几乎已经完成了这个工作,但需要一些帮助来获取错误。批处理脚本:不能得到循环正确检查

用户删除功能的伟大工程,出放临时文件,像这样:

"All Users" 
"Default" 
"Default User" 
"Public" 

“:UserDeleteJoin”将输出以下,如果我有回声

Public,Default User,Default,All Users 

完整检查代码,做我所描述的如下:

set UsersPath=%systemdrive%\Users\ 
DEL /F /Q /A:H %UsersPath%\desktop.ini 2>nul>nul 
forfiles /p %UsersPath% /m * /d -45 /c "cmd /c echo @file">%TEMP%\users.temp 
FOR /F "skip=1 tokens=1 delims=" %%P IN (%TEMP%\users.temp) DO CALL:UserDeleteJoin %%P 
set userdelete=%userdelete:"=% 
set userdelete=%userdelete:~0,-1% 
echo %userdelete% 
pause 
GOTO:USERPRESERVE 

:UserDeleteJoin 
if UserDeleteJoin_Skip=="" (set userdelete=%1 & set UserDeleteJoin_Skip=1) ELSE (set userdelete=%1,%userdelete%) 
goto:eof 

因此,照顾的主要issu e,现在只有脚本的其余部分,我最初从“http://mstoneblog.wordpress.com/2010/12/08/user-profile-cleaning-script-for-windows-7/”获得,这很好用但我想添加仅删除比x天更早的用户配置文件的功能。

所以我有最初的用户保留功能,因为我需要它保持常规用户。

set userpreserve="All Users,Default,Default User,Hell Bomb" 

脚本的下一块没有改变,但我会发布它是完整的。这将包括上面的代码行,并包含UserDeleteJoin函数之后的所有内容。

USERPRESERVE 
set userpreserve="All Users,Default,Default User,Hell Bomb" 

FOR /f "tokens=*" %%a IN ('reg query "hklm\software\microsoft\windows nt\currentversion\profilelist"^|find /i "s-1-5-21"') DO CALL :REGCHECK "%%a" 
GOTO VERIFY 

:REGCHECK 
set SPACECHECK= 
FOR /f "tokens=3,4" %%b in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATH=%%b %%c 
FOR /f "tokens=2" %%d in ('echo %USERREGPATH%') DO SET SPACECHECK=%%d 
IF ["%SPACECHECK%"]==[""] GOTO REGCHECK2 
GOTO USERCHECK 

:REGCHECK2 
FOR /f "tokens=3" %%g in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATH=%%g 
GOTO USERCHECK 

:USERCHECK 
FOR /f "tokens=3 delims=\" %%e in ('echo %USERREGPATH%') DO SET USERREG=%%e 
FOR /f "tokens=1 delims=." %%f IN ('echo %USERREG%') DO SET USERREGPARSE=%%f 
ECHO %USERPRESERVE%|find /I "%USERREGPARSE%" > NUL 
IF ERRORLEVEL=1 GOTO DELETECHECK 
IF ERRORLEVEL=0 GOTO SKIP 

:DELETECHECK 
ECHO %userdelete%|find /I "%USERREGPARSE%" > NUL 
IF ERRORLEVEL=1 GOTO SKIP 
IF ERRORLEVEL=0 GOTO CL 
GOTO:EOF 

:SKIP 
ECHO Skipping user clean for %USERREG% 
GOTO :EOF 

:CLEAN 
ECHO Cleaning user profile for %USERREG% 
::rmdir "C:\Users\%USERREG%" /s /q > NUL 
ECHO Cleaning user registry for %USERREG% 
::reg delete %1 /f 
::IF EXIST "C:\Users\%USERREG%" GOTO RETRYCLEAN1 
GOTO :EOF 

Im相当肯定,这个问题是与错误检查,但我真的不能告诉,因为真的只想打谱“三位一体技术公司”和“地狱炸弹”,而忽略其他所有配置文件尽管其他设置是什么。不幸的是,似乎无法缩小这个问题的范围,但那可能是因为我一直在为它的目的而努力。

我添加到原来的剧本脚本的部分是如下:

IF ERRORLEVEL=1 GOTO DELETECHECK 

而且

:DELETECHECK 
ECHO %userdelete%|find /I "%USERREGPARSE%" > NUL 
IF ERRORLEVEL=1 GOTO SKIP 
IF ERRORLEVEL=0 GOTO CL 
GOTO:EOF 

当我运行该脚本如下那是给我的输出,它应该跳过这两个文件夹,但不会删除其他用户配置文件。

Skipping user clean for Trinity Tech 
Skipping user clean for Hell Bomb 

其他的解决方案: 我想这可能是做了很多简单的是我能想出如何让FORFILES要列出年龄不超过45天的所有文件夹的话,我可以简单地做另一个循环像我为“:UserDeleteJoin”做了,并且不需要编辑原始脚本的主要部分。如果任何人有任何想法我可以做到这一点,我可以避免我现在拥有的所有问题。

完整剧本

@ECHO OFF 

set UsersPath=%systemdrive%\Users\ 
DEL /F /Q /A:H %UsersPath%\desktop.ini 2>nul>nul 
forfiles /p %UsersPath% /m * /d -45 /c "cmd /c echo @file">%TEMP%\users.temp 
FOR /F "skip=1 tokens=1 delims=" %%P IN (%TEMP%\users.temp) DO CALL:UserDeleteJoin %%P 
set userdelete=%userdelete:"=% 
set userdelete=%userdelete:~0,-1% 
GOTO:USERPRESERVE 

:UserDeleteJoin 
if UserDeleteJoin_Skip=="" (set userdelete=%1 & set UserDeleteJoin_Skip=1) ELSE (set userdelete=%1,%userdelete%) 
goto:eof 

:USERPRESERVE 
set userpreserve="All Users,Default,Default User,Hell Bomb" 

FOR /f "tokens=*" %%a IN ('reg query "hklm\software\microsoft\windows nt\currentversion\profilelist"^|find /i "s-1-5-21"') DO CALL :REGCHECK "%%a" 
GOTO VERIFY 

:REGCHECK 
set SPACECHECK= 
FOR /f "tokens=3,4" %%b in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATH=%%b %%c 
FOR /f "tokens=2" %%d in ('echo %USERREGPATH%') DO SET SPACECHECK=%%d 
IF ["%SPACECHECK%"]==[""] GOTO REGCHECK2 
GOTO USERCHECK 

:REGCHECK2 
FOR /f "tokens=3" %%g in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATH=%%g 
GOTO USERCHECK 

:USERCHECK 
FOR /f "tokens=3 delims=\" %%e in ('echo %USERREGPATH%') DO SET USERREG=%%e 
FOR /f "tokens=1 delims=." %%f IN ('echo %USERREG%') DO SET USERREGPARSE=%%f 
ECHO %USERPRESERVE%|find /I "%USERREGPARSE%" > NUL 
IF ERRORLEVEL=1 GOTO DELETECHECK 
IF ERRORLEVEL=0 GOTO SKIP 

:DELETECHECK 
FOR /f "tokens=3 delims=\" %%e in ('echo %USERREGPATH%') DO SET USERREG=%%e 
FOR /f "tokens=1 delims=." %%f IN ('echo %USERREG%') DO SET USERREGPARSE=%%f 
ECHO %userdelete%|find /I "%USERREGPARSE%" > NUL 
IF ERRORLEVEL=1 GOTO SKIP 
IF ERRORLEVEL=0 GOTO CL 
GOTO:EOF 

:SKIP 
ECHO Skipping user clean for %USERREG% 
GOTO :EOF 

:CLEAN 
ECHO Cleaning user profile for %USERREG% 
::rmdir "C:\Users\%USERREG%" /s /q > NUL 
ECHO Cleaning user registry for %USERREG% 
::reg delete %1 /f 
::IF EXIST "C:\Users\%USERREG%" GOTO RETRYCLEAN1 
GOTO :EOF 

:RETRYCLEAN1 
ECHO Retrying clean of user profile %USERREG% 
rmdir "C:\Users\%USERREG%" /s /q > NUL 
IF EXIST "C:\Users\%USERREG%" GOTO RETRYCLEAN2 
GOTO :EOF 

:RETRYCLEAN2 
ECHO Retrying clean of user profile %USERREG% 
rmdir "C:\Users\%USERREG%" /s /q > NUL 
GOTO :EOF 

:VERIFY 
FOR /f "tokens=*" %%g IN ('reg query "hklm\software\microsoft\windows nt\currentversion\profilelist"^|find /i "s-1-5-21"') DO CALL :REGCHECKV "%%g" 
GOTO REPORT 

:REGCHECKV 
set SPACECHECKV= 
FOR /f "tokens=3,4" %%h in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATHV=%%h %%i 
FOR /f "tokens=2" %%j in ('echo %USERREGPATHV%') DO SET SPACECHECKV=%%j 
IF ["%SPACECHECKV%"]==[""] GOTO REGCHECKV2 
GOTO USERCHECKV 

:REGCHECKV2 
FOR /f "tokens=3" %%k in ('reg query %1 /v ProfileImagePath') DO SET USERREGPATHV=%%k 
GOTO USERCHECKV 

:USERCHECKV 
FOR /f "tokens=3 delims=\" %%l in ('echo %USERREGPATHV%') DO SET USERREGV=%%l 
FOR /f "tokens=1 delims=." %%m IN ('echo %USERREGV%') DO SET USERREGPARSEV=%%m 
ECHO %USERPRESERVE%|find /I "%USERREGPARSEV%" > NUL 
IF ERRORLEVEL=1 GOTO VERIFYERROR 
IF ERRORLEVEL=0 GOTO :EOF 

:VERIFYERROR 
SET USERERROR=YES 
GOTO :EOF 

:REPORT 
IF [%USERERROR%]==[YES] (
     set RESULT=FAILURE 
)  ELSE (
     set RESULT=SUCCESS 
) 

Pause 
:EXIT 
exit 

:EOF 

回答

1

从原来的问题:

我想这可能是做了很多简单的我能想出 如何让FORFILES要列出所有文件夹不大于45 天

您已经获得较旧的文件夹列表然后45天。您可以简单地使用FINDSTR来查找不在该列表中的条目。

forfiles /p %UsersPath% /m * /c "cmd /c echo @file" | findstr /vixg:"%TEMP%\users.temp" 



是否确定要删除 “的desktop.ini”?或者你只是删除它,所以你只有文件夹来处理?

如果只想FORFILES列出文件夹,您可以执行以下操作:

forfiles /p %UsersPath% /m * /d -45 /c "cmd /c if @isdir=="TRUE" echo @file">%TEMP%\users.temp