2011-09-08 76 views
0

我使用此腳本清除所有用戶的歷史記錄,Cookie和緩存(臨時Internet文件),它也應該清理臨時目錄,但似乎有什麼問題。搜索並刪除臨時文件/文件夾(腳本的失敗)

兩件事情混在一起我認爲,%temp%變量(= D:\ TEMP在我的環境中) 和用戶臨時目錄中的%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在我的環境),並還可以找到人的「臨時目錄的」在%用戶資料%。

即,例如,這確實爲%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 

中這個IE。對於「用戶(或多個)溫度」 工作:

::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%組合部分,不知何故現在有兩件事情會混淆(「用戶溫度」和「環境溫度」)。

回答

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 
… 

如您所見,臨時變量用於存儲要處理的實際路徑。據我所知,僅替換臨時文件夾被清除的部分就足夠了,但如果需要,您可以看到該方法也可以輕鬆應用到其他文件夾。

+0

哇,這很好用!非常感謝,非常感謝。 – APOC

+0

Andriy M,HERO (我的)日;-p – APOC

+0

這是一種快樂! –

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" 
+0

這是我得到/得到與「我的」腳本(沒有任何變化): ** C :\ Documents and Settings \ admin-lksvdd \ D:\ TEMP ** – APOC

+0

我看到,我沒有考慮'非標準'D:\ TEMP路徑...請告訴我,這一連串動作的目的是什麼:首先獲取特殊文件夾的路徑,然後切掉開始部分(與配置文件路徑匹配的部分),然後再通過附加方式再次返回到完整路徑配置文件路徑到它最初的位置?起初我以爲相對路徑只能獲得一次,然後所有輪廓路徑都會輪流應用到它們上面。如果不是這樣,即腳本總是隻清理當前用戶的特殊文件夾,我認爲你應該省略那個額外的階段。 –

+0

不知道,這是一個我從谷歌緩存中「借出」的舊腳本(腳本所有者/構建者沒有反應),所以我在這裏試了一下。它確實也乾淨**多個用戶**雖然,請參閱ProfileImagePath上使用的查詢,此行發現/找到所有「活動」的用戶。 _Call:sf2「%temp%」「temp」「%userprofile%」_用於CurrentUser(僅限於我所知道的)AND _「ProfileImagePath」QUERY_用於查找「活動」用戶。 – APOC

0

我改變了一點溫度線,這是一個正確的方法? (它的工作,但它正確格式化?)

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」 爲可能的硬/只讀文件(及附加ATTRIB)

順便說一句 在「temp」部分的腳本中,仍然看不到100%的內容,我將默認的Windows默認溫度設置更改爲默認路徑,以便進行測試,並得到以下3個錯誤: screenshot of the error |網址:http://img199.imageshack.us/img199/9127/errorif.jpg

腳本Windows默認的臨時路徑的運行:

[用戶]%USERPROFILE%\本地設置的\ Temp [系統]的%SystemRoot%\溫度

我'我不知道爲什麼我會得到這些錯誤,當我將兩個臨時參數都設置爲D:\ TEMP時,我得到的錯誤類型是3次,而不是D:\ TEMP而不是可用/活動用戶\本地設置\ Temp。也許問題出在當地人〜1? (雖然臨時目錄確實得到清理,但它爲什麼說它找不到路徑?)

+0

問題確實** NOT **在目錄充滿文件時發生,所以上述錯誤只發生在目錄爲空時。怎麼來/爲什麼?可以阻止或隱藏這些消息嗎?(沒有發現任何東西) – APOC