Поиск и удаление временных файлов / папок (в скрипте произошел сбой) - PullRequest
0 голосов
/ 08 сентября 2011

Я использую этот скрипт для очистки истории, файлов cookie и кэша (временных файлов Интернета) для всех пользователей, и он также должен очищать временную директорию, НО, кажется, что-то не так.

Две вещи перепутаныдумаю, переменная %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%.

т.е. это, например,работает для% 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 вещи перепутаны сейчас ("пользователиtemp "en" environment environment ").

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Хорошо, на этот раз я думаю, что - это способ исправить это, а именно, добавив проверку, содержит ли переменная относительный или абсолютный путь, непосредственно перед продолжением очистки. Идея состоит в том, чтобы проверить наличие двоеточия (:) в строке. Если двоеточие присутствует, то путь не может быть ранее преобразован в относительный путь, поэтому его следует использовать как есть, без предварительного ожидания пути к профилю, в противном случае путь к профилю должен быть присоединен перед продолжением.

Вот базовый пример, с которым вы можете протестировать и поиграть, если хотите:

@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 голосов
/ 09 сентября 2011

Я немного изменил строку для 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" -part все еще кажется, что что-то не идет на 100%, я изменил свои временные настройки по умолчанию в окнах для целей тестирования путей по умолчанию и получаю эти 3 ошибки: скриншот ошибки |url: http://img199.imageshack.us/img199/9127/errorif.jpg

скрипт запускается с временным путем Windows по умолчанию:

[пользователь]% UserProfile% \ Local Settings \ Temp и [system]% SystemRoot% \ Temp

Я не уверен, почему я получаю эти ошибки, когда я устанавливаю оба временных параметра в D: \ TEMP, я получаю в 3 раза ошибку того же рода, но чем дляD: \ TEMP вместо доступных / активных пользователей \ локальные настройки \ Temp.Возможно проблема в местных жителях ~ 1 ???(Тем не менее, временные каталоги очищаются, но почему они не могут найти путь?)

0 голосов
/ 08 сентября 2011

Кажется, что ваша подпрограмма 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"
...