Показать полную графическую версию : [решено] bat-файл на удаление папок и файлов по списку из txt-файла
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.