0

わかりました、これでほぼ完了しましたが、バグを取り除くための助けが必要です。

ユーザー削除機能はうまく機能し、次のように TEMP ファイルを出力します。

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

":UserDeleteJoin" は echo で確認すると以下のように出力されます

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

これで主な問題は解決しましたが、スクリプトの残りの部分だけです。 -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

問題はエラーチェックにあると確信していますが、「Trinity Tech Corp」と「Hell Bomb」のプロファイルのみをヒットしたいだけで、他の設定に関係なく他のすべてのプロファイルを無視するため、実際にはわかりません. 残念ながらそれ以上に問題を絞り込むことはできないようですが、それは私がかなり長い間それを見てきたためかもしれません.

元のスクリプトに追加したスクリプトの部分は次のとおりです。

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
4

1 に答える 1

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
于 2012-06-24T14:17:22.790 に答える