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),并在 %userprofile% 中找到所有“临时目录”。

IE。例如,这适用于 %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% 部分结合使用,现在有两件事混淆了(“users temp”和“environment temp”) .

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”用于可能的硬/只读文件(和附加属性)

顺便说一句 ,脚本中的“temp”部分似乎仍然没有 100% 运行,我将 Windows 中的默认临时设置更改为用于测试目的的默认路径,我得到 了这 3 个错误:错误截图| 网址:http: //img199.imageshack.us/img199/9127/errorif.jpg

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

[用户] %UserProfile%\Local Settings\Temp[系统] %SystemRoot%\Temp

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

于 2011-09-09T13:37:07.137 回答