Войти

Показать полную графическую версию : [решено] bat-файл на удаление папок и файлов по списку из txt-файла


Страниц : [1] 2 3

timahvey
29-08-2019, 16:20
Имеется файл txt, в котором построчно указаны пути к файлам и папкам. Например:
c:\Program Files\NVIDIA Corporation\license.txt
c:\Program Files\Windows Defender\ThirdPartyNotices.txt
c:\Program Files (x86)\ASUS\ASUS Smart Gesture\AsTPCenter\x86\
Пути на разных разделах и с кириллическими символами.

Можно ли сделать отдельный bat файл, который будет смотреть в рядом лежащий с ним файл need_to_delete.txt и удалять все папки и файлы по указанным (в need_to_delete.txt) адресам?
+ по итогам выдавать инфу: "столько то удалено файлов и папок, столько то места освобождено".

Iska
29-08-2019, 16:51
и с кириллическими символами. »
Упакуйте образец Вашего «файл txt» в архив и приложите к сообщению.

timahvey
29-08-2019, 17:31
пароль: picasso

timahvey
29-08-2019, 17:33
P.S. В файле не указаны пути с кириллическими буквами. Но в дальнейшем будут таковые, т.к. есть папки с русскими названиями.

Iska
29-08-2019, 18:19
В файле не указаны пути с кириллическими буквами. »
Укажите. В файле. Я хочу посмотреть на кодировку Вашего файла.

пароль: picasso »
Пароль не нужен.

YuS_2
29-08-2019, 19:03
В файле не указаны пути с кириллическими буквами. »
это важно. необходимо определить кодировку файла...
скрипт powershell подойдет для решения задачи?

megaloman
29-08-2019, 21:32
@Echo Off
cls
>nul chcp 1251
Set "FileIn=%~dp0need_to_delete.txt"
Set "WorkDisk=C:"

If Not Exist "%FileIn%" (Echo !!! File "%FileIn%" not found &Pause &Exit /B 2)

FOR /F "usebackq skip=2 delims=" %%i IN (`"wmic logicaldisk where caption="%WorkDisk%" get FreeSpace,Size /value"`) DO >nul 2>&1 Call Set "%%i"
Set "F1=%FreeSpace%"

Set /A Ndir=0
Set /A Nfile=0

FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO (
If Exist "%%s" (
If "%%~nxs"=="" (
>nul 2>&1 Rd /q /s "%%s" &&Set /A Ndir+=1
) Else (
>nul 2>&1 Del /A /F "%%s" &&Set /A Nfile+=1
)
)
)
FOR /F "usebackq skip=2 delims=" %%i IN (`"wmic logicaldisk where caption="%WorkDisk%" get FreeSpace,Size /value"`) DO >nul 2>&1 Call Set "%%i"
Set "F2=%FreeSpace%"

Echo Total Size %WorkDisk% =%Size% bytes
Echo free space before deleting =%F1% bytes
Echo deleted %Ndir% folders and %Nfile% files
Echo free space after deleting =%F2% bytes

Set "F1=%F1:~0,-6%"
Set "F2=%F2:~0,-6%"
If "%F1%"=="" Set /A F1=0
If "%F2%"=="" Set /A F2=0
Set /A Freed=%F2%-%F1%

Echo %Freed% million bytes freed
pause
Exit /B
Если список имеет кириллические символы в кодировке 866 >nul chcp 1251удалить

alpap
29-08-2019, 22:42
timahvey, не помню точно, утверждать не буду, но был случай когда по примерно такому (как у вас в файле) пути:
c:\Windows\WinToolkit_Temp\
скрипт отказался удалять вроде из-за нехватки прав, но при этом остановился весь процесс. Проконтролируйте этот момент на всякий случай.

timahvey
30-08-2019, 09:34
скрипт powershell подойдет для решения задачи? »
Да. можно и PowerShell.
Пока у меня кодировка используется 1251.
CMD »
Благодарю! Попробую в ближайшие дни. Я правильно понимаю, сносить будет все файлы: хоть для чтения, хоть скрытые (окромя в папке Windows\System32\) и папки с файлами?

скрипт отказался удалять вроде из-за нехватки прав »
А можно это как-то обойти? ну или хотя бы сразу же запрашивать права админа и сносить все к чертям?

timahvey
30-08-2019, 11:18
CMD »
Показывает лишь свободное пространство до и после в байтах.
А можно как-то не вычетом этих цифр, а именно просчетом занимаемого пространства на диске суммировать все высвобожденное пространство в МБ?

megaloman
30-08-2019, 18:12
@Echo Off
cls
>nul chcp 1251
Set "FileIn=%~dp0need_to_delete.txt"

If Not Exist "%FileIn%" (Echo !!! File "%FileIn%" not found &Pause &Exit /B 2)

Set /A Ndir=0
Set /A Nfile=0
Set /A Zfile=0

FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO (
If Exist "%%s" (
If "%%~nxs"=="" (
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%%s" /b /s /a:-d`) DO (
Del "%%f" &&(Set /A Zfile+=%%~zf &Set /A Nfile+=1)
)
>nul 2>&1 Rd /q /s "%%s" &&Set /A Ndir+=1
) Else (
Del /A /F "%%s" &&(Set /A Zfile+=%%~zs &Set /A Nfile+=1)
)
)
)
Set /A ZfileK=%Zfile%/1024
Set /A ZfileM=%Zfile%/(1024*1024)

Echo Ndir=%Ndir%
Echo Nfile=%Nfile%
Echo Zfile=%Zfile% byte
Echo Zfile=%ZfileK% Kbyte
Echo Zfile=%ZfileM% Mbyte

pause
Exit /Bсчитает реальное число удаленных файлов, в том числе в каталогах и подкаталогах. суммирует их общий объем. Количество папок считает по папкам, помянутым в списке, подпапки не рассматриваются

YuS_2
30-08-2019, 20:04
можно и PowerShell. »
function Get-SizeDirectory {
param (
[parameter(ValueFromPipeline=$true)]
[string[]]$arr
)
process {
foreach ($item in $arr) {
try {
$tmp = gi $item -ea 1
$math = dir -lit $tmp.fullname -rec -force|
?{!$_.psiscontainer}|measure -prop length -sum
[pscustomobject]@{
Name = $tmp.name #Имя каталога
Fullname = $tmp.fullname #Абсолютный путь с именем
Count = $math.count #Счетчик файлов в каталоге, рекурсивно
Size = $math.sum #Размер каталога
}
} catch {
$(
('{0:dd.MM.yy HH:mm:ss}' -f (get-date)
)+' - folder_error'),$item.fullname,$_|
out-file $logerr -enc utf8 -app
}
}
}
}

# Файл со списком
$list = 'need_to_delete.txt'
# Кодировка файла
$enc = 'default'
# Логи
$log = 'log.log'
$logerr = 'error.log'

gc $list -enc $enc|%{
try{
$a = gi -lit $_ -force -ea 1
if(test-path -lit $a.fullname -patht 'leaf'){
$x = $a.length
del -lit $a.fullname -force -ea 1
$size += $x; $cntfile += 1
} else {
$b = $a.fullname|get-sizedirectory
del $a.fullname -rec -force -ea 1
$size += $b.size; $cntfolder += 1
}
}catch{
$(('{0:dd.MM.yy HH:mm:ss}' -f (get-date))+' - item_error'),$_|
out-file $logerr -enc utf8 -app
}
}

@"
Удалено файлов: $cntfile
Удалено каталогов: $cntfolder (без учета подкаталогов и вложенных файлов)
$('Освобождено: {0:G} Mb' -f ($size/1mb))
"@|tee $log
Чтобы не было проблем с доступом, запускать лучше от имени админа.
При ошибках будет выводить логи.
Считать будет общий размер каталогов и файлов из списка
При подаче на удаление каталога (указание пути к каталогу, а не к файлу в списке), в количестве удаленных будет учтена только единица самого каталога из списка... ни подкаталоги, ни вложенные файлы не считаются.
А как надо?

DJ Mogarych
30-08-2019, 20:43
Проще сначала всё посчитать, а потом удалить. Первая строчка требует запуска от админа.
Округление только в конце, т. к. определение каталогов сделано по нулевой длине, вернее, по её отсутствию. Можно сделать по фен-шую, в том числе отчёт в csv, но вряд ли это в данном случае нужно.
#Requires -RunAsAdministrator

$all = @()
gc ~\Downloads\need_to_delete.txt |% {
$temp = "" |select "path","length"
$temp.path = "$_"
$temp.length = get-item "$_" |select -expand length -ErrorAction Ignore
$all += $temp
}

$all += "`n" + "Файлов: " + ($all |? length -ne $null |measure).count
$all += "Каталогов: " + ($all |? length -eq $null |measure).count
$all += "Общий размер: " + [math]::Round((($all |select -expand length |measure -sum).sum / 1MB),2) + " МБ"

$all |out-file ~\Downloads\reports.txt

$all.path |% {Remove-Item "$_" -Recurse -Force -Confirm:$false -ErrorAction Ignore}

alpap
30-08-2019, 21:23
сразу же запрашивать права админа »
ну у вас в системе они и так вероятно есть, а если это для кого-то делается, то где этот кто-то возьмет права при запросе, если их нет и так и требуется, тут вывод только один - не трогать системные папки, исключить из файла все подобные пути.

YuS_2
30-08-2019, 22:12
определение каталогов сделано по нулевой длине »
Тут одна загвоздка:
столько то места освобождено »
удалить-то можно, но размер освобожденного места на диске будет посчитан только для файлов из списка...

Iska
30-08-2019, 22:23
YuS_2, в реальности, если уж строго придерживаться заявленного ТЗ «столько то места освобождено» — ещё хуже: а) часть удалённых файлов, банально умещавшихся в самом MFT, никак не повлияет на «освобождённое место», б) к размерам «освобождённого места» нужно добавлять не просто размеры файлов, а размеры, которые файлы занимают на диске (освобождаемые кластеры).

DJ Mogarych
30-08-2019, 22:24
YuS_2, не понял, в чём проблема. Сумма размеров файлов и будет освобождённым местом, нет?

timahvey
30-08-2019, 23:55
Можно сделать по фен-шую »
Верно, достаточно и этого варианта! На нём пока и остановлюсь.

Единственное, что хотелось бы решить, так это удаление фалов системных. Можно ли это как-то обойти?
Например, файл c:\Program Files\Windows Defender\ThirdPartyNotices.txt сносится через мелкую утилиту "Unlocker". Возможно она просто автоматом в NTFS правах делает меня (пользователя запустившего скрипт) владельцем файла?

YuS_2
30-08-2019, 23:57
часть удалённых файлов, банально умещавшихся в самом MFT, никак не повлияет на «освобождённое место» »
Это смотря что понимать под "освобожденным местом". Если расчетные показатели, то да, а если фактические, то это, как раз, только размер файлов...

часть удалённых файлов, банально умещавшихся в самом MFT, никак не повлияет на «освобождённое место» »
то же самое...

к размерам «освобождённого места» нужно добавлять не просто размеры файлов, а размеры, которые файлы занимают на диске (освобождаемые кластеры). »
Этого точно нет в условии, да и проблематично это было бы, считать средствами powershell.

не понял, в чём проблема. Сумма размеров файлов и будет освобождённым местом, нет? »
Нет. Если говорить о размерах каталога, то, это, как раз, сумма размеров ВСЕХ файлов, содержащихся в нем.
И именно поэтому, такая конструкция:
$temp.length = get-item "$_" |select -expand length -ErrorAction Ignore »
не покажет размера, если "$_" - каталог.

YuS_2
31-08-2019, 00:15
Возможно она просто автоматом в NTFS правах делает меня (пользователя запустившего скрипт) владельцем файла? »
Вот именно, даже администратор не сможет удалять то, владельцем чего является не он, а пользователь с более высоким уровнем доступа... по иерархии прав доступа в Windows.
В частности, владельцы с именем TrustedInstaller и System, имеют более высокий уровень, чем Администратор.




© OSzone.net 2001-2012