搜索&删除临时文件/文件夹(脚本失败)

时间:2011-09-08 14:14:22

标签: batch-file search delete-file temp

我使用此脚本为所有用户清除历史记录,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),并在%userprofile%中找到al“temp dir”。 / p>

即。这例如适用于%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

,这就是适用于“用户温度”

::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件事现在混淆了(“用户临时”en“环境温度“)。

3 个答案:

答案 0 :(得分: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
…

如您所见,临时变量用于存储要处理的实际路径。我知道仅替换清除临时文件夹的部分就足够了,但是如果需要,您可以看到该方法也可以轻松应用于其他文件夹。

答案 1 :(得分: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"

答案 2 :(得分: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”表示可能的硬/只读文件(及其他属性)

顺便说一句 在使用“temp”-part的脚本中似乎仍然没有100%的内容,我将Windows中的默认临时设置更改为默认路径以进行测试,我得到以下3个错误: screenshot of the error |网址:http://img199.imageshack.us/img199/9127/errorif.jpg

脚本使用windows默认临时路径运行:

[user]%UserProfile%\ Local Settings \ Temp [system]%SystemRoot%\ Temp

我不确定为什么会出现这些错误,当我将两个临时参数都设置为D:\ TEMP时,我得到的错误类型是3次,而不是D:\ TEMP而不是可用/活动用户\ local设置\ TEMP。也许问题出在当地人身上~1 ??? (虽然临时目录确实被清理了,但为什么它说它找不到路径?)