Batch script: kan de lus niet correct laten controleren

Ok, ik heb dit bijna klaar, maar ik heb hulp nodig om de bugs weg te krijgen.

De User Delete-functie werkt prima en geeft het TEMP-bestEn als volgt:

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

": UserDeleteJoin" zal het volgende uitvoeren als ik het aanvink met een echo

Public,Default User,Default,All Users

De volledige code die doet wat ik heb beschreven is als volgt:

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

Dus dat zorgt voor het hoofdprobleem, nu alleen de rest van het script, dat ik in eerste instantie kreeg van "http://mstoneblog.wordpress.com/2010/12/08/user-profile-cleaning-script-for-windows -7/"wat prima werkt, maar ik wilde de mogelijkheid toevoegen om alleen gebruikersprofielen ouder dan x aantal dagen te verwijderen.

Dus ik heb de oorspronkelijke gebruikersbewaarfunctie als wat ik nodig heb om de gewone gebruikers te houden.

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

Het volgende deel van het script is ongewijzigd, maar ik zal het posten als voltooid. Dit bevat de bovenstaEne regel en behEnelt alles wat overblijft na de: UserDeleteJoin-functie.

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

Ik ben er vrij zeker van dat het probleem is met de foutcontrole, maar ik kan het niet zeggen, want het wil alleen de profielen "Trinity Tech Corp" en "Hell Bomb" raken en negeert alle Enere profielen, ondanks wat Enere instellingen zijn. Ik kan het probleem helaas niet verder beperken dan dat, maar dat komt misschien omdat ik het al te lang heb bestudeerd.

Het deel van het script dat ik aan het originele script heb toegevoegd, was als volgt:

IF ERRORLEVEL=1 GOTO DELETECHECK

En

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

De uitvoer die me wordt gegeven wanneer ik het script uitvoer, is als volgt, en het zou beide mappen moeten overslaan, maar het verwijdert de andere gebruikersprofielen niet.

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

Other solutions: I was thinking this could be made a lot simpler is i could figure out how to get FORFILES to list all folders that are NOT older than 45 days then i could simply do another loop like i did for ":UserDeleteJoin" En would not have to edit the main part of the original script. If anyone has any idea how I can do that i can avoid all the issues i am having now.

Volledig script

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

1 antwoord

Van de oorspronkelijke vraag:

Ik zat te denken dat dit een stuk eenvoudiger kon worden als ik het kon achterhalen   hoe FORFILES te krijgen om een ​​lijst weer te geven van alle mappen die NIET ouder zijn dan 45   dagen

U hebt de lijst met mappen die ouder zijn dan 45 dagen al. U kunt eenvoudig FINDSTR gebruiken om naar vermeldingen te zoeken die niet in die lijst voorkomen.

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



Weet u zeker dat u "desktop.ini" wilt verwijderen? Of wis je het gewoon zodat je alleen mappen hebt om mee om te gaan?

Als u alleen FORFILES mappen wilt laten weergeven, kunt u het volgende doen:

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