Показать полную графическую версию : [решено] bat-файл на удаление папок и файлов по списку из txt-файла
Это смотря что понимать под "освобожденным местом". Если расчетные показатели, то да, а если фактические, то это, как раз, только размер файлов... »
Судя по ТЗ — это именно занимаемое место на диске. Оно же — фактически. А теоретически, расчётное — это сумма объёмов файлов.
…да и проблематично это было бы, считать средствами powershell. »
Да и не нужно.
YuS_2, DJ Mogarych, в Scripting.FileSystemObject свойство .Size класса Folder как раз показывает размер каталога, подсчитывая сумму объёмов всех входящих в него файлов, включая подкаталоги. В классах .Net, относящихся к работе с каталогами файловой системы, как я понял, аналогичное свойство отсутствует, так?
DJ Mogarych
31-08-2019, 07:51
Всё, понял. Я просто генерил свой текстовый файл, где все объекты были внутри одного каталога, поэтому содержимое вложенных каталогов можно было не учитывать, т. к. их пути уже были в файле.
Можно вставить вот такую конструкцию для подсчёта размеров каталогов:
gc ~\Downloads\need_to_delete.txt |% {
if (((Get-Item "$_") -is [System.IO.DirectoryInfo]) -eq 'True') {
(gci "$_" -Recurse |select -expand length |measure -sum).sum / 1MB
}
}
файл c:\Program Files\Windows Defender\ThirdPartyNotices.txt сносится через мелкую утилиту "Unlocker". Возможно она просто автоматом в NTFS правах делает меня (пользователя запустившего скрипт) владельцем файла? »
Файл не удаляется, если какой-либо процесс его в данный момент использует, и Анлокер просто "освобождает" файл из-под процесса. Не могу назвать это хорошей практикой, лучше подобные вещи не делать без крайней необходимости.
теоретически, расчётное — это сумма объёмов файлов. »
Строго говоря, да, согласен.
Но, в любом случае, посчитать мы можем только то, что отдает система...
В классах .Net, относящихся к работе с каталогами файловой системы, как я понял, аналогичное свойство отсутствует, так? »
Утверждать не берусь, но пока не попадалось, а целенаправленно не искал.
К тому же, мы всегда можем дернуть тот же Scripting.FileSystemObject:
$fso = new-object -com scripting.filesystemobject
$folder = $fso.getfolder("d:\test")
$folder.size
В общем, с этим проблем немного.
(gci "$_" -Recurse |select -expand length |measure -sum).sum / 1MB »
Для начала, имеет смысл протестировать этот метод... сразу скажу, он негоден, начиная с версии PS -v 3.0, т.к. в версии 2.0 было:
Параметр Recurse работает только в том случае, если путь указывает на контейнер с дочерними элементами, например "C:\Windows" или "C:\Windows\*", и не работает, если путь указывает на элементы без дочерних элементов, например "C:\Windows\*.exe".
Теперь же, ошибки он тоже не выдаст, но при условии, что элемент $_ - файл, он выдаст не размер файла, а именно рекурсивно размер родительского каталога относительно файла $_... как-то так.
DJ Mogarych
31-08-2019, 10:44
YuS_2, там условие стоит - "если каталог".
Единственное - можно убрать один ненужный пайп:
(gci "$_" -Recurse |measure -sum length).sum / 1MB
Но, в любом случае, посчитать мы можем только то, что отдает система... »
Взять свободное место на разделе до, взять свободное место на разделе после, показать разницу :). Тут, конечно, надо будет вести учёт, с каких разделов мы удаляем.
там условие стоит - "если каталог". »
Да, с условным оператором работать будет, но всё равно, к общей сумме придется увязывать в конечном итоге... и файлы надо не забыть посчитать внутри каталога, если таки понадобится информация именно по файлам, а не единице каталога... в моем варианте они считаются, просто не используются эти данные.
Взять свободное место на разделе до, взять свободное место на разделе после, показать разницу . Тут, конечно, надо будет вести учёт, с каких разделов мы удаляем. »
На расшаренном каталоге, например, по сетевому пути... :)
timahvey
31-08-2019, 12:34
Все же пока будет оптимальным этот вариант.
просчетом занимаемого пространства на диске суммировать все высвобожденное пространство. »
Удобно, запустить пакетный файл на любом ПК в пару кликов без копипастов..
Из хотелок осталось лишь: возможность удалять файлы и папки других владельцев. Т.е., что б скрипт автоматом при выдаче "Отказано в доступе." делал смену владельца (скрипт то будет запущен из под пользователя с админ правами) для удаления уже с повышенными привилегиями.
Но это уже смахивает на мини программу :)
В пн.-вт. закроем тему, если нет доп. предложений.
Благодарю всех участвующих!
На расшаренном каталоге, например, по сетевому пути... »
Это да. Хотя, если временно «примапить»… Хрен его знает, мне даже проверить негде.
Хотя, если временно «примапить»… »
Да, получить свободное пространство сетевого диска можно через get-item, тут только надо будет как-то контролировать тип пути, unc или замапленный диск.
Если путь не UNC, то всё сводится к этому:
(($x = gi z:\).psprovider.drives|? name -ceq $x.psdrive).free
а если путь unc, то придется его мапить... ну, а если путей таких много, придется подключать, замерять, отключать в каждой итерации...
В общем, имхо, проще посчитать сумму размеров файлов.
В общем, имхо, проще посчитать сумму размеров файлов. »
Не, проще не обрабатывать UNC, объявив сие фичей ;).
проще не обрабатывать UNC, объявив сие фичей »
ну, это-то да, как вариант... :good: :ok: :smoke:
megaloman
01-09-2019, 10:31
Iska, YuS_2, Но поезд идёт, и бутыль опустела, и тянет поговорить...Если WSH, то .GetDriveName справляется и с буквой и с UNC. Далее .GetDrive(то что получили в GetDriveName).FreeSpace считает свободное место. Массив по помянутым в списке буквам диска и UNC-путям организовать не проблема,FileIn = "Z:\need_to_delete.txt"
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
With .OpenTextFile(FileIn, 1)
LErr = Not Err.Number <> 0
If Not LErr Then
MsgBox "Error open file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
Else
InTxt = Split(.ReadAll, vbCrLf)
LErr = Not Err.Number <> 0
If Not LErr Then
MsgBox "Error read file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
End If
.Close
End With
On Error GoTo 0
jN = -1
AllDisk = ""
For Each jName In InTxt
jN = jN + 1
InTxt(jN) = Trim(jName)
jDisk = .GetDriveName(InTxt(jN))
If jDisk <> "" Then
If InStr(1, AllDisk, jDisk) = 0 Then AllDisk = AllDisk + "*" + jDisk
End If
Next
AllDisk = Split(Mid(AllDisk, 2), "*")
jN = UBound(AllDisk)
Msg = ""
ReDim DFree(jN + 1)
For j = 0 To jN
DFree(j) = .GetDrive(AllDisk(j)).FreeSpace
Msg = Msg + AllDisk(j) + " " + CStr(DFree(j) / 1024 / 1024) + vbCrLf
Next
MsgBox Msg
End With а затем посчитать разность места до некоего действа и после него на каждом из элементов. А подсчитывать число удалённых файлов и папок практически ни о чём - зачем это нужно? С правами по любому напряжно ... :Beer:
Но поезд идёт, и бутыль опустела, и тянет поговорить... »
А первый кричал - куда хотим, туда едем, и можем если надо cвернуть,
Второй отвечал, что поезд проедет лишь там, где проложен путь.
А подсчитывать число удалённых файлов и папок практически ни о чём - зачем это нужно? С правами по любому напряжно »
удалили - посчитали, не удалили - запись в лог ошибок. Далее анализ. Но согласен, что цифры количества удаленных элементов не несут никакого смысла.
Если WSH, то .GetDriveName справляется и с буквой и с UNC. »
да справиться-то не проблема, вопрос только в надобности ТС-у всего этого кода...
так-то можно легко получить свободное пространство удаленной машины:
(icm -comp serv1 {Get-PSDrive}).free|measure -sum
т.е. надо только определить, что путь является unc путем, выделить имя сервера и вуаля...
timahvey
01-09-2019, 23:19
цифры количества удаленных элементов не несут никакого смысла »
Суть лишь в том, что если покажет "удалено 10 файлов", то сразу пойдут мысли "что-то тут не то или уже проводилось удаление ранее".
т.е. надо только определить, что путь является unc путем, выделить имя сервера и вуаля... »
Не, ещё надо по имени разделённого ресурса определить, на каком разделе он расположен.
что-то тут не то или уже проводилось удаление ранее »
Ну, хорошо, получили мы цифру 9, вместо 10 (условно)... а дальше, что делать будем, что даст для анализа эта недостающая единица? Каждый файл из списка проверять - удалился или нет? Зачем тогда скрипт? Ведь список может состоять и из 10000 файлов... мне, например, было бы жалко своего времени на подобные поиски.
Вот, в чем вопрос.
Не, ещё надо по имени разделённого ресурса определить, на каком разделе он расположен. »
Тоже, сначала, решил, что надо бы определить, но потом подумалось - а какую это даст информацию и для чего? Ведь требуется, всего лишь, определить освобожденное пространство.
Разницу нетрудно посчитать по всем разделам удаленной машины...
(icm -comp serv1 {Get-PSDrive}).free|measure -sum »
то бишь, для подсчета освобожденного пространства, нам вообще не требуется считать размеры файлов, ни локальных, ни удаленных машин...
((get-psdrive).free|measure -sum).sum
- запущенное на локальной машине до удаления и после него, выдаст цифры, разница которых и будет искомым освобожденным пространством.
timahvey
02-09-2019, 10:56
цифру 9, вместо 10 »
:) Нет, цифру 9 вместо 123 (или 500).
а какую это даст информацию и для чего? »
А… Вы имеете в виду, просто посчитать сумму всех свободных мест. Понял Вашу мысль.
Нет, цифру 9 вместо 123 (или 500). »
Допустим... и что будет предприниматься? Какие файлы удалились, а какие нет? Где искать? Сравнивать весь список с наличием файлов? Сизифов труд...
В этих цифрах информации ноль.
просто посчитать сумму всех свободных мест. »
Да, типа того. Правда в таком методе есть большой недостаток, хоть он и будет работать быстрее, но в нем не учитывается наличие других процессов, работающих с файловой системой. Т.е. существует большая вероятность, что свободное пространство может и в минус уйти, и больше оказаться, чем сумма размера удаленных элементов.
В общем, использование метода будет сильно зависеть от требований точности в определении свободного пространства. Наиболее точный, всё же, это подсчет размера удаляемых элементов.
timahvey
03-09-2019, 09:00
Какие файлы удалились, а какие нет? Г » Скрипт от megaloman как раз таки и показывает какие не удалились файлы.
Суть в цифре, как уже ранее писал, наглядность: удалило 9 файлов - значит либо скрипт уже был запущен ранее, либо что-то пошло не так., Удалило 100+ файлов - ок. (понятно, что в зависимости от количества элементов в списке эта цифра может быть больше).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.