【问题标题】:Search & delete temp files/folder (script's got a failure)搜索和删除临时文件/文件夹(脚本失败)
【发布时间】:2023-03-23 08:06:01
【问题描述】:

我使用此脚本为所有用户清理历史记录、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% 部分结合使用,现在有两件事混淆了(“用户临时”和“环境温度”)。

【问题讨论】:

    标签: batch-file search delete-file 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
    …
    

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

    【讨论】:

    • Andriy M,(我的)当天的英雄;-p
    • (当目录为空时它确实会给出“错误”/消息,这是为什么呢?)
    • 不确定你在说什么。如果您的意思是执行rmdir /S /Q . 时的错误,那么它不仅发生在空目录上,而且每次都发生(至少在 Win 7 上)。 rmdir 尝试删除当前目录(.)及其所有内容并抱怨无法这样做(删除当前目录),这很公平,因为系统禁止删除活动(当前)文件夹。
    • 这不是“我的”错误。我收到的内容是“该进程无法访问该文件,因为它正在被另一个进程使用”(对不起,我不确定这是否是确切的英文等价物,原件是俄语)。所以,嗯……确实很奇怪。
    • 我觉得奇怪的是返回的“错误”是:,,系统找不到指定的路径''。可能是因为它确实像您刚才提到的那样尝试删除当前目录。该脚本确实删除了指定目录中的文件/目录(除非文件正在使用中),因此该部分似乎工作正常。有没有办法抑制上述“错误”/消息?
    【解决方案2】:

    您的 sf2 子例程似乎正试图通过切断路径的开头来获取 Temp 文件夹的相对路径,该路径本质上是用户配置文件路径:

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

    其中sf 包含临时文件夹,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\APOCC:\DOCUME~1\APOC 不匹配,自然。结果,$$temp 变量以完整路径而不是相对路径结束,因此,引用 $$temp 的代码的相关部分无法按预期工作。

    简而言之,我认为您根本不需要 sf2 例程。 sf1 例程似乎与sf2 一样,只是传递了一组不同的参数。所以,而不是

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

    我建议你试试这个:

    Call:sf1 "%temp%" "temp"
    

    【讨论】:

    • 这是我通过“我的”脚本得到/得到的结果(尚未更改):C:\Documents and Settings\admin-lksvdd\D:\TEMP跨度>
    • 我明白了,我没有考虑到'非标准'D:\TEMP路径...请告诉我,这一系列动作的目的是什么:首先获取路径一个特殊的文件夹,然后切断开始部分(与配置文件路径匹配的部分),然后通过将配置文件路径附加到最初的位置再次返回完整路径?起初我以为相对路径只获取一次,然后将所有profile路径轮流应用到它们。如果不是这样,即如果脚本总是清理当前用户的特殊文件夹,我认为你应该省略那个额外的阶段。
    • 不确定,这是我从谷歌缓存中“借来”的旧脚本(脚本所有者/构建者没有反应),所以我在这里尝试了。它确实也清除了多个用户,但请参阅 ProfileImagePath 上使用的查询,此行发现/查找所有“活动”用户。 Call:sf2 "%temp%" "temp" "%userprofile%" 为 CurrentUser (仅?据我所知)和 "ProfileImagePath" QUERY 以查找“活动"-用户。
    • 使用默认的 windows temp 并且它再次工作:%UserProfile%\Local Settings\Temp(对于当前用户) %SystemRoot %\Temp(系统变量)。现在如何修复脚本,以便在不使用任何窗口默认值时它仍然可以工作......那是事情发生可怕错误的时候:-(
    【解决方案3】:

    我稍微改变了 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 个错误: screenshot of the error |网址:http://img199.imageshack.us/img199/9127/errorif.jpg

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

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

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

    【讨论】:

    • 问题确实NOT在目录已满时发生,因此上述错误仅在目录为空时发生。怎么来/为什么?这可以防止或隐藏这些消息吗? (没有找到任何东西)
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多