0

このスクリプトを使用して、すべてのユーザーの履歴、Cookie、およびキャッシュ (一時インターネット ファイル) を消去します。また、一時ディレクトリも消去する必要がありますが、何か問題があるようです。

私が思うに、%temp%変数(=私の環境ではD:\ TEMP)とユーザーの一時ディレクトリの2つが混同されてい%userprofile%ます。

:: Works on Win XP  -and-  on Win 7

@echo off

Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
set "regkey2=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\shell folders"

call:getspecialfolders "Cache, History, Cookies"

For /f "tokens=*" %%? in (
 'Reg.exe QUERY "%RegKey%" ^|findstr /ric:"\S-1-5-21-[0-9]*-[0-9]*-[0-9]*-[0-9]*$"'
 ) do (
 For /f "tokens=2,*" %%A in (
 'Reg.exe QUERY "%%?" /v ProfileImagePath ^|find /i "ProfileImagePath"'
 ) do call:Go %%B
)

start ""/w "%windir%\system32\RunDll32.exe" InetCpl.cpl,ClearMyTracksByProcess 255

:end ***


goto:EOF
:Go
   call Set "Target=%*"
   If EXIST "%Target%" call:Clear "%Target%"
exit /b 0

:Clear
REM echo.&echo.%~1\%$$Cache%
   pushD "%~1\%$$Cache%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_TEMP_IE.txt

REM echo.&echo.%~1\%$$History%\History.IE5
REM    pushD "%~1\%$$History%\History.IE5" &&(
REM    rmdir /S /Q .
REM    popD)2>C:\test1_History_IE.txt

REM echo.&echo.%~1\%$$History%
   pushD "%~1\%$$History%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_History.txt

REM echo.&echo.%~1\%$$Cookies%
   pushD "%~1\%$$Cookies%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_Cookies.txt

ECHO.&echo.%~1\%$$temp%
   pushD "%~1\%$$temp%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_Temp.txt
exit /b 0

:getspecialfolders
   Set "FoldersToClear=%~1"

   For %%* in (%FoldersToClear%) Do (
     For /f "tokens=2,*" %%A in (
     'reg.exe query "%regkey2%" /v %%* ^|find /i "%%~*"'
     ) do Call:sf1 "%%~B" "%%~*"
   )
   Call:sf2 "%temp%" "temp" "%userprofile%"
exit /b 0

:sf1
   Call set "sf=%~1"
   Call set "$$%~2=%%sf:%userprofile%\=%%"
exit /b 0

:sf2
   Call set "sf=%~1"
   call Set "usr=%~dpns3"
   Call set "$$%~2=%%sf:%usr%\=%%"
exit /b 0

しかし、どういうわけか、最後の「一時部分」を機能させることができないため、%temp% (私の環境では D:\Temp) をクリーンアップし、%userprofile% で「一時ディレクトリ」も検索します。

すなわち。たとえば、これは %temp% に対して機能します

PushD "%Temp%" && (
ATTRIB -S -H -R -A /D /S & (
For /f "Tokens=*" %%* in ('dir "%Temp%" /B') Do (
RD "%Temp%\%%*" /S /Q || Del /F /S /Q "%Temp%\%%*"))&PopD)2>c:\test0b_TEMP.txt

そしてこれ。"user(s) temp" のために働きます:

::Set Search directory to "Documents and Settings" folder
(Set Target=%AllUsersProfile:~0,-10%)

title,Finding the Temp subfolders in %Target%&COLOR 9E

If EXIST "%Target%",(
  For /f "Tokens=*" %%* in ('dir "%Target%" /B') Do (
   cd/D "%target%\%%*\Local Settings\Temp" && (
   ATTRIB -S -H -R -A /D /S >nul & (
  For /f "Tokens=*" %%* in ('dir /B') Do (
   RD "%%*" /S /Q ||Del /F "%%*" )))>nul)
 )

誰かがスクリプトの修正を手伝ってくれることを願っています。それは :sf2 にあると思います および/または %temp% 部分と組み合わせて、どういうわけか2つのことが混ざり合っています(「ユーザーの一時」と「環境の一時」) .

4

3 に答える 3

1

わかりました。今回は、これを修正する方法があると思います。つまり、変数に相対パスが含まれているか絶対パスが含まれているかのチェックを、クリーンアップを続行する直前に追加することです。:アイデアは、文字列にコロン ( ) が存在するかどうかをテストすることです。コロンが存在する場合、以前はパスを相対パスに変換できなかったため、プロファイル パスを前に保留せずにそのまま使用する必要があります。それ以外の場合は、先に進む前にプロファイル パスをアタッチする必要があります。

必要に応じて、テストして遊ぶことができる基本的な例を次に示します。

@ECHO OFF
SET somepath=D:\TEMP
CALL :checkpath
SET "somepath=Local Settings\Temp"
CALL :checkpath
PAUSE
GOTO :EOF

:checkpath
IF "%somepath%"=="%somepath:*:=%" (ECHO Relative path) ELSE ECHO (Absolute path)

あなたの特定の状況では、おそらく次のような方法を適用します。

それ以外の

…
ECHO.&echo.%~1\%$$temp%
   pushD "%~1\%$$temp%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_Temp.txt
…

私は試してみます

…
IF "%$$temp%"=="%$$temp:*:=%" (SET "tmppath=%~1\%$$temp%") ELSE SET "tmppath=%$$temp%"
ECHO.&echo.%tmppath%
   pushD "%tmppath%" &&(
   rmdir /S /Q .
   popD)2>C:\test1_Temp.txt
…

ご覧のとおり、処理される実際のパスを格納するために一時変数が使用されます。一時フォルダーがクリアされている部分だけを置き換えるだけで十分ですが、必要に応じて他のフォルダーにも簡単に適用できることがわかります。

于 2011-09-09T11:48:19.530 に答える
0

sf2サブルーチンは、基本的にユーザー プロファイル パスであるパスの先頭を切り取って、Temp フォルダーの相対パスを取得しようとしているようです。

Call set "$$%~2=%%sf:%usr%\=%%"

ここsfには、Temp フォルダーとusrユーザー プロファイルが含まれます。したがって、たとえば、代わりに、C:\Documents and Settings\APOC\Local Settings\Temp単にLocal Settings\Temp.

しかし、問題があります。変数sfには適切なパスが割り当てられていますが、usr一方で、変数には、何らかの理由で、ユーザー プロファイル パスの短い名前のバリアントが割り当てられています。つまり、 のようなものではなく、 のようなC:\Documents and Settings\APOCものを受け取りますC:\DOCUME~1\APOC。問題のある行は次のとおりです。

call Set "usr=%~dpns3"

したがって、以前に引用された行が実行されると、期待される置換は決して起こりC:\Documents and Settings\APOCませんC:\DOCUME~1\APOC。その結果、$$temp変数は相対パスではなく完全なパスになり、そのため、参照するコードの関連部分は$$temp期待どおりに機能しません。

sf2要するに、そのルーチンはまったく必要ないと思います。このルーチンは、渡すパラメータのセットが異なるだけで、 とsf1まったく同じように見えます。sf2だから、代わりに

Call:sf2 "%temp%" "temp" "%userprofile%"

これを試すことをお勧めします:

Call:sf1 "%temp%" "temp"
于 2011-09-08T16:35:34.887 に答える
0

temp の行を少し変更しましたが、これは正しい方法ですか? (動作しますが、適切にフォーマットされていますか?)

IF "%$$temp%"=="%$$temp:*:=%" (SET "tmppath=%~1\%$$temp%") ELSE SET "tmppath=%$$temp%"
ECHO.&echo.%tmppath%
   pushD "%tmppath%" &&(
   ATTRIB -S -H -R -A /D /S & (
   rmdir /S /Q . || Del /F /S /Q .
   )&popD)2>C:\test1_Temp.txt

+可能なハード/読み取り専用ファイル用の追加の「Del /f /s /q」(および追加の属性)

ちなみに、 「一時」部分のスクリプトではまだ何かが 100% 進んでいないようです。Windows のデフォルトの一時設定を、テスト目的でデフォルトのパスに変更したところ、次の 3 つのエラーが発生しました。エラーの スクリーンショット | エラーのスクリーンショット| URL: http://img199.imageshack.us/img199/9127/errorif.jpg

Windows のデフォルトの一時パスで実行されるスクリプト:

[ユーザー] %UserProfile%\Local Settings\Tempおよび[システム] %SystemRoot%\Temp

これらのエラーが発生する理由がわかりません。両方の一時パラメーターを D:\TEMP に設定すると、同じ種類のエラーが 3 回発生しますが、D:\TEMP ではなく、使用可能な/アクティブなユーザー \local settings\Temp の場合よりも多くなります。 . おそらく問題は locals にあります ~1 ??? (ただし、一時ディレクトリは消去されますが、パスが見つからないと表示されるのはなぜですか?)

于 2011-09-09T13:37:07.137 に答える