![]() |
bat-файл на удаление папок и файлов по списку из txt-файла
Имеется файл txt, в котором построчно указаны пути к файлам и папкам. Например:
Код:
c:\Program Files\NVIDIA Corporation\license.txt Можно ли сделать отдельный bat файл, который будет смотреть в рядом лежащий с ним файл need_to_delete.txt и удалять все папки и файлы по указанным (в need_to_delete.txt) адресам? + по итогам выдавать инфу: "столько то удалено файлов и папок, столько то места освобождено". |
Цитата:
|
Вложений: 1
пароль: picasso
|
P.S. В файле не указаны пути с кириллическими буквами. Но в дальнейшем будут таковые, т.к. есть папки с русскими названиями.
|
|
Цитата:
скрипт powershell подойдет для решения задачи? |
CMD
Код:
@Echo Off |
timahvey, не помню точно, утверждать не буду, но был случай когда по примерно такому (как у вас в файле) пути:
c:\Windows\WinToolkit_Temp\ скрипт отказался удалять вроде из-за нехватки прав, но при этом остановился весь процесс. Проконтролируйте этот момент на всякий случай. |
Цитата:
Пока у меня кодировка используется 1251. Цитата:
Цитата:
|
Цитата:
А можно как-то не вычетом этих цифр, а именно просчетом занимаемого пространства на диске суммировать все высвобожденное пространство в МБ? |
просчетом занимаемого пространства на диске суммировать все высвобожденное пространство.
Но будет работать только если общий объем высвобождаемого места не более 2Gb Иначе надо vbs или JS либо еще что-нибудь Код:
@Echo Off |
Цитата:
скрипт powershell
Код:
function Get-SizeDirectory { Чтобы не было проблем с доступом, запускать лучше от имени админа. При ошибках будет выводить логи. Считать будет общий размер каталогов и файлов из списка При подаче на удаление каталога (указание пути к каталогу, а не к файлу в списке), в количестве удаленных будет учтена только единица самого каталога из списка... ни подкаталоги, ни вложенные файлы не считаются. А как надо? |
Проще сначала всё посчитать, а потом удалить. Первая строчка требует запуска от админа.
Округление только в конце, т. к. определение каталогов сделано по нулевой длине, вернее, по её отсутствию. Можно сделать по фен-шую, в том числе отчёт в csv, но вряд ли это в данном случае нужно. Код:
#Requires -RunAsAdministrator |
Цитата:
|
|
YuS_2, в реальности, если уж строго придерживаться заявленного ТЗ «столько то места освобождено» — ещё хуже: а) часть удалённых файлов, банально умещавшихся в самом MFT, никак не повлияет на «освобождённое место», б) к размерам «освобождённого места» нужно добавлять не просто размеры файлов, а размеры, которые файлы занимают на диске (освобождаемые кластеры).
|
YuS_2, не понял, в чём проблема. Сумма размеров файлов и будет освобождённым местом, нет?
|
Цитата:
Единственное, что хотелось бы решить, так это удаление фалов системных. Можно ли это как-то обойти? Например, файл c:\Program Files\Windows Defender\ThirdPartyNotices.txt сносится через мелкую утилиту "Unlocker". Возможно она просто автоматом в NTFS правах делает меня (пользователя запустившего скрипт) владельцем файла? |
Цитата:
Цитата:
Цитата:
Цитата:
И именно поэтому, такая конструкция: Цитата:
|
Цитата:
В частности, владельцы с именем TrustedInstaller и System, имеют более высокий уровень, чем Администратор. |
Цитата:
Цитата:
YuS_2, DJ Mogarych, в Scripting.FileSystemObject свойство .Size класса Folder как раз показывает размер каталога, подсчитывая сумму объёмов всех входящих в него файлов, включая подкаталоги. В классах .Net, относящихся к работе с каталогами файловой системы, как я понял, аналогичное свойство отсутствует, так? |
Всё, понял. Я просто генерил свой текстовый файл, где все объекты были внутри одного каталога, поэтому содержимое вложенных каталогов можно было не учитывать, т. к. их пути уже были в файле.
Можно вставить вот такую конструкцию для подсчёта размеров каталогов: Код:
gc ~\Downloads\need_to_delete.txt |% { Цитата:
|
Цитата:
Но, в любом случае, посчитать мы можем только то, что отдает система... Цитата:
К тому же, мы всегда можем дернуть тот же Scripting.FileSystemObject: Код:
$fso = new-object -com scripting.filesystemobject Цитата:
Цитата:
|
YuS_2, там условие стоит - "если каталог".
Единственное - можно убрать один ненужный пайп: Код:
(gci "$_" -Recurse |measure -sum length).sum / 1MB |
Цитата:
|
Цитата:
Цитата:
|
Все же пока будет оптимальным этот вариант.
Цитата:
Из хотелок осталось лишь: возможность удалять файлы и папки других владельцев. Т.е., что б скрипт автоматом при выдаче "Отказано в доступе." делал смену владельца (скрипт то будет запущен из под пользователя с админ правами) для удаления уже с повышенными привилегиями. Но это уже смахивает на мини программу :) В пн.-вт. закроем тему, если нет доп. предложений. Благодарю всех участвующих! |
Цитата:
|
Цитата:
Если путь не UNC, то всё сводится к этому: Код:
(($x = gi z:\).psprovider.drives|? name -ceq $x.psdrive).free В общем, имхо, проще посчитать сумму размеров файлов. |
Цитата:
|
Цитата:
|
Iska, YuS_2,
Цитата:
Например
Код:
FileIn = "Z:\need_to_delete.txt" |
Цитата:
Цитата:
Цитата:
Цитата:
так-то можно легко получить свободное пространство удаленной машины: Код:
(icm -comp serv1 {Get-PSDrive}).free|measure -sum |
Цитата:
|
Цитата:
|
Цитата:
Вот, в чем вопрос. Цитата:
Разницу нетрудно посчитать по всем разделам удаленной машины... Цитата:
Код:
((get-psdrive).free|measure -sum).sum |
Цитата:
|
Цитата:
|
Цитата:
В этих цифрах информации ноль. Цитата:
В общем, использование метода будет сильно зависеть от требований точности в определении свободного пространства. Наиболее точный, всё же, это подсчет размера удаляемых элементов. |
Цитата:
Суть в цифре, как уже ранее писал, наглядность: удалило 9 файлов - значит либо скрипт уже был запущен ранее, либо что-то пошло не так., Удалило 100+ файлов - ок. (понятно, что в зависимости от количества элементов в списке эта цифра может быть больше). |
Попробую примерить костюмчик на себя:
Зачем всё это нужно - удалить с диска заведомо ненужное и проконтролировать свободное место. Главное в процессе - почему что-то не удалилось. Для этого нужен лог с отказами. Его изучение полезно. В принципе, не столь важна цифра освобожденного места. Но если очень хочется, удаляем каждый файл из указанных и каждый файл в указанных папках и их подпапках и суммируем их объем или пишем в лог отказ и его причину. |
Цитата:
|
timahvey,
VBS. Считает свободное место на диске до и после работы скрипта и разницу в Mb.
Количество реально удалённых файлов и их общий объём. При отказе в удалении имя файла и причина отказа заносится в лог. Код:
FileIn = "Z:\need_to_delete.txt" |
Вложений: 1
Цитата:
А вот картинка c кракозябрами и минусовым объемом высвобожденного пространства. |
Вложений: 1
Цитата:
|
Вложений: 1
Символ в символ с тем что Вы выложили.
Возможно Вы сами ошиблись кодировкой, т.к. даже в web показывает кракозябры. |
Вложений: 1
Цитата:
|
Цитата:
|
Время: 23:24. |
Время: 23:24.
© OSzone.net 2001-