PDA

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


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

megaloman
03-09-2019, 09:11
Попробую примерить костюмчик на себя:
Зачем всё это нужно - удалить с диска заведомо ненужное и проконтролировать свободное место.
Главное в процессе - почему что-то не удалилось. Для этого нужен лог с отказами. Его изучение полезно.
В принципе, не столь важна цифра освобожденного места.
Но если очень хочется, удаляем каждый файл из указанных и каждый файл в указанных папках и их подпапках и суммируем их объем или пишем в лог отказ и его причину.

timahvey
03-09-2019, 09:17
Зачем всё это нужно » все именно так!

megaloman
03-09-2019, 21:13
timahvey, FileIn = "Z:\need_to_delete.txt"
FileLog = "Z:\need_to_delete.txt.Err.log"

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO
Set Finfo = .OpenTextFile(FileLog, 2, True)

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
strAllDisk = ""

For Each jName In InTxt
jN = jN + 1
InTxt(jN) = Trim(jName)
jDisk = .GetDriveName(InTxt(jN))
If jDisk <> "" Then
If InStr(1, strAllDisk, jDisk) = 0 Then strAllDisk = strAllDisk + vbCrLf + jDisk
End If
Next
strAllDisk = Mid(strAllDisk, 3)
AllDisk = Split(strAllDisk, vbCrLf)
jN = UBound(AllDisk)

strAllFree1 = ""
Msg = ""
ReDim AllFree1(jN + 1), AllFree2(jN + 1)

On Error Resume Next
For j = 0 To jN
Err.Number = 0
AllFree1(j) = .GetDrive(AllDisk(j)).FreeSpace
If Err.Number <> 0 Then
AllFree1(j) = Err.Description
strAllFree1 = strAllFree1 + vbCrLf + AllDisk(j) + " = " + AllFree1(j)
Else
strAllFree1 = strAllFree1 + vbCrLf + AllDisk(j) + " = " + CStr(Round(AllFree1(j) / 1024 / 1024, 1)) + " Mb"
End If
Next
On Error GoTo 0
Msg = Msg + "До обработки свободно:" + vbCrLf + "=====" + strAllFree1

TotalNfiles = 0
TotalDelete = 0

On Error Resume Next
For Each F In InTxt
If .FileExists(F) Then
SizeOne = .GetFile(F).Size
Err.Number = 0
.DeleteFile F, True
If Err.Number <> 0 Then
Finfo.WriteLine ("--- " + Err.Description + " -> " + F)
Else
TotalNfiles = TotalNfiles + 1
'Finfo.WriteLine "+++ Ok" + " -> " + F + " " + CStr(TotalNfiles) + " " + CStr(SizeOne) + " " + CStr(TotalDelete)
TotalDelete = TotalDelete + SizeOne
End If
Else
If .FolderExists(F) Then
If Right(F, 1) = "\" Then F = Left(F, Len(F) - 1)
Call AllFiles(FSO, Finfo, F, TotalNfiles, TotalDelete)
Err.Number = 0
.DeleteFolder F, True
If Err.Number <> 0 Then
Finfo.WriteLine ("--- " + Err.Description + " -> " + F)
End If
End If
End If
Next
On Error GoTo 0

strAllFree2 = ""

On Error Resume Next
For j = 0 To jN
Err.Number = 0
AllFree2(j) = .GetDrive(AllDisk(j)).FreeSpace

If Err.Number <> 0 Then
AllFree2(j) = Err.Description
strAllFree2 = strAllFree2 + vbCrLf + AllDisk(j) + " = " + AllFree2(j)
Else
strAllFree2 = strAllFree2 + vbCrLf + AllDisk(j) + " = " + CStr(Round(AllFree2(j) / 1024 / 1024, 1)) + " Mb"
End If
Next
On Error GoTo 0

' Msg = Msg + vbCrLf + vbCrLf + "Удалено " + CStr(TotalNfiles) + " файлов " + CStr(TotalDelete) + " bytes"
Msg = Msg + vbCrLf + vbCrLf + "Удалено " + CStr(TotalNfiles) + " файлов " + CStr(Round(TotalDelete / 1024/ 1024,1)) + " Mb"
Msg = Msg + vbCrLf + vbCrLf + "После обработки свободно:" + vbCrLf + "=====" + strAllFree2

TotalFree = 0
For j = 0 To jN
If IsNumeric(AllFree2(j)) And IsNumeric(AllFree1(j)) Then
TotalFree = TotalFree + AllFree2(j) - AllFree1(j)
End If
Next
On Error GoTo 0

Msg = Msg + vbCrLf + vbCrLf + "Суммарная разность = " + CStr(Round(TotalFree / 1024 / 1024, 1)) + " Mb"
Finfo.Close
End With

MsgBox Msg
' ============================
Sub AllFiles(FSO, Finfo, WDir, TotalNfiles, TotalDelete)
Set Folds = FSO.GetFolder(WDir)
Set SubF = Folds.SubFolders
Set Files = Folds.Files

On Error Resume Next
For Each jF In Files
SizeOne = jF.Size
Err.Number = 0
FSO.DeleteFile jF, True
If Err.Number <> 0 Then
Finfo.WriteLine ("--- " + Err.Description + " -> " + jF)
Else
TotalNfiles = TotalNfiles + 1
'Finfo.WriteLine "+++ Ok" + " -> " + jF + " " + CStr(TotalNfiles) + " " + CStr(SizeOne) + " " + CStr(TotalDelete)
TotalDelete = TotalDelete + SizeOne
End If
Next
On Error GoTo 0

For Each Folder In SubF
Call AllFiles(FSO, Finfo, WDir + "\" + Folder.Name, TotalNfiles, TotalDelete)
Next
End Sub

timahvey
04-09-2019, 10:29
megaloman »
Благодарю. В конечном итоге удобный log с путями, где отказано в доступе было.
А вот картинка c кракозябрами и минусовым объемом высвобожденного пространства.

timahvey
04-09-2019, 10:37
1251»

timahvey
04-09-2019, 10:45
Символ в символ с тем что Вы выложили.
Возможно Вы сами ошиблись кодировкой, т.к. даже в web показывает кракозябры.

megaloman
04-09-2019, 11:40
Символ в символ с тем что Вы выложили.
Возможно Вы сами ошиблись кодировкой, т.к. даже в web показывает кракозябры. »В общем, сам дурак :) . Не посмотрел, когда переносил скрипт на форум. Исправил (см выше). На всякий случай приложил файл.

timahvey
04-09-2019, 11:49
Исправил »
Красота :)




© OSzone.net 2001-2012