PDA

Показать полную графическую версию : [решено] Удаление одинаковых файлов по размеру


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

amel27
18-07-2011, 12:59
Батник затыкается на не правильных именах файлов »ну это не проблема, вот два различных решения:
@(
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
19-07-2011, 08:35
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 (предыдущую) папку, иногда трудно попасть в папку из-за бооольшого кол-ва файлов.

Iska
20-07-2011, 06:59
…нужно именно количество удалённых файлов? »
правильно мыслите, »
Примерно так:
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 файлов.

Я не понял Вашу мысль. Поясните, пожалуйста, на примере. » вы уже реализовали её.

Iska
20-07-2011, 13:06
Хотя если можно то ее можно оставить, включая или отключая её через ключ (параметр).

Можно добавить в логе писал: Total delete: YY file(s) из XXX файлов. »
Сделаем, но позже.

Iska
08-08-2011, 04:53
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