Войти

Показать полную графическую версию : [решено] При удалении файлов из DOWNLOAD батником эта папка становиться недоступна


nikhop
25-02-2019, 15:07
При удалении всех файлов/папок из DOWNLOAD батником папка DOWNLOAD становиться недоступна. Почему?

Браузеры начинают по-умолчанию сохранять в Documents\Download.

Батник:
@echo off
rd /s /q "%USERPROFILE%\Downloads"

Iska
25-02-2019, 15:50
При удалении всех файлов/папок из DOWNLOAD батником папка DOWNLOAD становиться недоступна. »
Потому, что Вы вместо очистки удаляете сам каталог. Так делать не нужно.

P.S. Вечером поищу готовый код.

nikhop
25-02-2019, 15:56
Спасибо за указание ошибки.
удаляете сам каталог »
А если дописать "%USERPROFILE%\Downloads\*.*" как-нибудь? Прокатит?

Anton04
25-02-2019, 16:43
А если дописать "%USERPROFILE%\Downloads\*.*" как-нибудь? Прокатит? »

Нужна другая команда из разряда "del" и прокатит, но в в этом случае удалит только файлы в текущей папке и не удалит ни вложенные каталоги, ни их содержимое.

nikhop
25-02-2019, 16:54
Iska, Anton04, спасибо, порыскал нашёл конкретное готовое решение:

@echo off
PUSHD %USERPROFILE%\Downloads\
2>Nul RD /S/Q "%USERPROFILE%\Downloads\"
POPD

И второй вариант без удаления конкретно файла
@echo off
setlocal enableextensions enabledelayedexpansion

rem Укажите местонахождение директории для очистки
set sTargetFolder=%USERPROFILE%\Downloads\

rem Поддиректория (или файл), которая НЕ должна удаляться
set sExcludeFilesOrFolders="trash.bat"

for /f "tokens=*" %%i in ('dir "%sTargetFolder%" /b /a:-d') do (
set /a bDelete = 1

for %%j in (%sExcludeFilesOrFolders%) do (
if /i "%%i" equ "%%~j" set /a bDelete = 0
)

if !bDelete! equ 1 del /f /q "%sTargetFolder%\%%i"
)

for /f "tokens=*" %%i in ('dir "%sTargetFolder%" /b /a:d') do (
set /a bDelete = 1

for %%j in (%sExcludeFilesOrFolders%) do (
if /i "%%i" equ "%%~j" set /a bDelete = 0
)

if !bDelete! equ 1 rd /s /q "%sTargetFolder%\%%i"
)

endlocal
exit /b 0

Vadikan
25-02-2019, 18:39
Windows 10 может очищать эту папку автоматически с заданным интервалом без костылей. См. Параметры - (Поиск)- Контроль памяти.

https://t.me/sterkin_ru/670 | https://vk.com/wall-81672804_5972

yurfed
25-02-2019, 19:02
Vadikan, очень разумное решение.
Это всё здорово, но планировщиков я "ненавижу терпеть".
Не спрашиваем почему, я и сам уже не помню откуда это, но, именно так.
Считать сообщение отступом от темы, в сторону флейма.

nikhop
25-02-2019, 19:04
Vadikan, ну охренеть :closed-to Спасибо! :up

Vadikan
25-02-2019, 19:08
yurfed, фича не требует планировщика. Он нужен только в том случае, если не устраивают интервалы 1, 14, 30, 60 дней.

Но даже в этом случае батник не нужен, ибо папка в сфере cleanmgr http://www.oszone.net/13312/

См. также Удаление временных файлов скриптом по расписанию http://www.outsidethebox.ms/11968/

Iska
26-02-2019, 20:56
nikhop, в общем случае можно использовать подобное (код удалит все файлы, не имеющие атрибутов hydden или system):
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%UserProfile%\Downloads

2>nul pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /a:-d-h-s /b "*.*"`) do echo del /f /q "%%~i"
popd
) || (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)

endlocal
exit /b 0

Для реального удаления убрать echo. Использовать подход с RD (даже в сочетании с pushd "%UserProfile%\Downloads") в данном случае не следует — поскольку так попадёт под раздачу и файл desktop.ini, который отвечает за специконку и отображаемое имя папки в Проводнике.

Но, коль в Windows 10 есть встроенный механизм, описанный выше коллегой Vadikan — лучше пользовать его.

nikhop
27-02-2019, 15:51
Для реального удаления убрать echo »
хотелось бы скрытно удалять )

mwz
27-02-2019, 17:14
хотелось бы скрытно удалять »

Это не батник, а VB-скрипт нужен.

Iska
27-02-2019, 20:16
Примерно так (на WSH, не проверялось):
Option Explicit

Dim objFolder
Dim objSubFolder
Dim objFile


Set objFolder = WScript.CreateObject("Shell.Application").NameSpace("shell:Downloads")

If Not objFolder Is Nothing Then
With WScript.CreateObject("Scripting.FileSystemObject").GetFolder(objFolder.self.Path)
For Each objSubFolder In .SubFolders
'WScript.Echo "[" & objSubFolder.Name & "]"
objSubFolder.Delete True
Next

For Each objFile In .Files
If Not StrComp(objFile.Name, "desktop.ini", vbTextCompare) = 0 Then
'WScript.Echo objFile.Name
objFile.Delete True
End If
Next
End With

Set objFolder = Nothing
Else
WScript.Echo "Can't access into user [Downloads] folder."
WScript.Quit 1
End If

WScript.Quit 0

И, тем не менее, повторюсь:
…коль в Windows 10 есть встроенный механизм, описанный выше коллегой Vadikan — лучше пользовать его. »




© OSzone.net 2001-2012