Показать полную графическую версию : [решено] Удаление одинаковых файлов по размеру
Батник затыкается на не правильных именах файлов »ну это не проблема, вот два различных решения:
@(
pushd "C:\TEST"
for /f "delims=" %%f in ('dir/b/a-d/os') do @(
if defined $fz (set/a "$fc=$fz-%%~zf"
call set "$fc=%%$fc:0=%%"
if not defined $fc del "%%f")
set "$fz=%%~zf"))
@(
pushd "C:\TEST"
for /f "delims=" %%f in ('dir/b/a-d/os') do @(
if defined $fz (SetLocal EnableDelayedExpansion
if !$fz! equ %%~zf del "%%f"
EndLocal)
set "$fz=%%~zf"))
Arsenik77
18-07-2011, 17:04
Iska, А можете сделать log файл, сколько файлов было удалено??
Скрипт отлично работает, большое спасибо!!
Iska, А можете сделать log файл, сколько файлов было удалено?? »
Попробуйте так:
Option Explicit
' IOMode Enum
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
' Format Enum
Const TristateUseDefault = -2
Const TristateTrue = -1
Const TristateFalse = 0
Dim objFSO
Dim strFolder
Dim objFile
Dim objDictionary
Dim elem
Dim objTS
If WScript.Arguments.Count = 1 Then
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
strFolder = WScript.Arguments.Item(0)
If objFSO.FolderExists(strFolder) Then
Set objTS = objFSO.OpenTextFile( _
objFSO.BuildPath( _
objFSO.GetParentFolderName(WScript.ScriptFullName), _
objFSO.GetBaseName(WScript.ScriptFullName) & ".log" _
), ForAppending, True, TristateTrue)
objTS.WriteLine
objTS.WriteLine FormatDateTime(Now())
objTS.WriteLine
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
For Each objFile In objFSO.GetFolder(strFolder).Files
If objDictionary.Exists(objFile.Size) Then
objTS.WriteLine objFile.Path
objFSO.DeleteFile objFile.Path, True
Else
objDictionary.Add objFile.Size, objFile.Path
End If
Next
objDictionary.RemoveAll
Set objDictionary = Nothing
objTS.Close
Set objTS = Nothing
Else
WScript.Echo "Folder [" & strFolder & "] not found."
End If
Set objFSO = Nothing
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <folder>"
End If
WScript.Quit 0
Лог-файл будет создан в той же папке [сие, конечно, в корне неправильно] и под тем же именем, что и скрипт, но с расширением «.log».
P.S. Или имена Вам не важны, а нужно именно количество удалённых файлов?
Arsenik77
20-07-2011, 06:27
нужно именно количество удалённых файлов » правильно мыслите,
сие, конечно, в корне неправильно » и это тоже верно, лучше сделать чтоб лог записывался -1 (предыдущую) папку, иногда трудно попасть в папку из-за бооольшого кол-ва файлов.
…нужно именно количество удалённых файлов? »
правильно мыслите, »
Примерно так:
Option Explicit
' IOMode Enum
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
' Format Enum
Const TristateUseDefault = -2
Const TristateTrue = -1
Const TristateFalse = 0
Dim objFSO
Dim strFolder
Dim objFile
Dim objDictionary
Dim elem
Dim objTS
Dim lngCount
If WScript.Arguments.Count = 1 Then
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
strFolder = WScript.Arguments.Item(0)
If objFSO.FolderExists(strFolder) Then
Set objTS = objFSO.OpenTextFile( _
objFSO.BuildPath( _
objFSO.GetParentFolderName(WScript.ScriptFullName), _
objFSO.GetBaseName(WScript.ScriptFullName) & ".log" _
), ForAppending, True, TristateTrue)
objTS.WriteLine
objTS.WriteLine FormatDateTime(Now())
objTS.WriteLine
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
lngCount = 0
For Each objFile In objFSO.GetFolder(strFolder).Files
If objDictionary.Exists(objFile.Size) Then
objTS.WriteLine objFile.Path
objFSO.DeleteFile objFile.Path, True
lngCount = lngCount + 1
Else
objDictionary.Add objFile.Size, objFile.Path
End If
Next
objDictionary.RemoveAll
Set objDictionary = Nothing
objTS.WriteLine
objTS.WriteLine "Total delete: " & lngCount & " file(s)"
objTS.Close
Set objTS = Nothing
Else
WScript.Echo "Folder [" & strFolder & "] not found."
End If
Set objFSO = Nothing
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <folder>"
End If
WScript.Quit 0
лучше сделать чтоб лог записывался -1 (предыдущую) папку, »
Я не понял Вашу мысль. Поясните, пожалуйста, на примере.
Arsenik77
20-07-2011, 09:24
Примерно так: » нет список файлов не надо вообще, иногда он может быть ооочень большим.
Последний раз Ваш скрипт обработал 330 тыщ.файлов, удалив порядка 160 тыщи файлов.
Хотя если можно то ее можно оставить, включая или отключая её через ключ (параметр).
Можно добавить в логе писал: Total delete: YY file(s) из XXX файлов.
Я не понял Вашу мысль. Поясните, пожалуйста, на примере. » вы уже реализовали её.
Хотя если можно то ее можно оставить, включая или отключая её через ключ (параметр).
Можно добавить в логе писал: Total delete: YY file(s) из XXX файлов. »
Сделаем, но позже.
Arsenik77, сделал:
<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<package>
<job>
<?job error="True" Debug="True" ?>
<runtime>
<description>Description: Delete 'duplicate' files in folder by equal size</description>
<unnamed
name = "Folder"
helpstring = "Path to folder to scan"
many = "False"
required = "True"
/>
<named
name = "IncludeNames2Log"
helpstring = "Include paths of deleted files to log"
type = "Simple"
required = "False"
/>
<example>
Example: Script.wsf "c:\Temp" [/IncludeNames2Log]</example>
</runtime>
<reference object="Scripting.FileSystemObject" />
<object id="objFSO" progid="Scripting.FileSystemObject" />
<object id="objDictionary" progid="Scripting.Dictionary" />
<script language="VBScript">
<![CDATA[
Option Explicit
With WScript.Arguments
Select Case .Count
Case 1
If .Unnamed.Count = 1 Then
WScript.Quit Working(.Unnamed.Item(0), False)
End If
Case 2
If .Unnamed.Count = 1 And .Named.Count = 1 Then
If .Named.Exists("IncludeNames2Log") Then
WScript.Quit Working(.Unnamed.Item(0), True)
End If
End If
Case Else
' Nothing to do
End Select
End With
WScript.Echo "Error in arguments"
WScript.Echo
WScript.Arguments.ShowUsage()
WScript.Quit 1
'=========================================================================
'=========================================================================
Function Working(strFolder, boolIncludeNames2Log)
Dim collFiles
Dim objFile
Dim elem
Dim objTS
Dim lngTotalCount
Dim lngDeleteCount
If objFSO.FolderExists(strFolder) Then
Set objTS = objFSO.OpenTextFile( _
objFSO.BuildPath( _
objFSO.GetParentFolderName(WScript.ScriptFullName), _
objFSO.GetBaseName(WScript.ScriptFullName) & ".log" _
), ForAppending, True, TristateTrue)
objTS.WriteLine
objTS.WriteLine FormatDateTime(Now())
objTS.WriteLine
Set collFiles = objFSO.GetFolder(strFolder).Files
lngDeleteCount = 0
lngTotalCount = collFiles.Count
For Each objFile In collFiles
If objDictionary.Exists(objFile.Size) Then
If boolIncludeNames2Log Then
objTS.WriteLine objFile.Path
End If
objFSO.DeleteFile objFile.Path, True
lngDeleteCount = lngDeleteCount + 1
Else
objDictionary.Add objFile.Size, objFile.Path
End If
Next
Set collFiles = Nothing
objDictionary.RemoveAll
objTS.WriteLine
objTS.WriteLine "Deleted " & lngDeleteCount & " of " & lngTotalCount & " file(s)"
objTS.Close
Set objTS = Nothing
Working = 0
Else
WScript.Echo "Folder [" & strFolder & "] not found."
WScript.Echo
Working = 2
End If
End Function
'=========================================================================
]]>
</script>
</job>
</package>
Приведённый код сохранить в файл с расширением «.wsf» в кодировке ANSI (Windows-1251).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.