Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Ответить
Настройки темы
CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Пользователь


Сообщения: 72
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: Arsenik77
Дата: 16-07-2011
Добрый день, нужен батник который сравнивал и удалял одинаковые по размеру файлы в одной папке (и оставлял только один).
Сторонние программы не хочу использовать, нужно именно bat.

Отправлено: 10:41, 16-07-2011

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Arsenik77:
Батник затыкается на не правильных именах файлов »
ну это не проблема, вот два различных решения:
Код: Выделить весь код
@(
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"))

Отправлено: 12:59, 18-07-2011 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 72
Благодарности: 1

Профиль | Отправить PM | Цитировать


Iska, А можете сделать log файл, сколько файлов было удалено??
Скрипт отлично работает, большое спасибо!!

Отправлено: 17:04, 18-07-2011 | #22


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Arsenik77:
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. Или имена Вам не важны, а нужно именно количество удалённых файлов?

Отправлено: 08:35, 19-07-2011 | #23


Пользователь


Сообщения: 72
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Iska:
нужно именно количество удалённых файлов »
правильно мыслите,
Цитата Iska:
сие, конечно, в корне неправильно »
и это тоже верно, лучше сделать чтоб лог записывался -1 (предыдущую) папку, иногда трудно попасть в папку из-за бооольшого кол-ва файлов.

Отправлено: 06:27, 20-07-2011 | #24


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Arsenik77:
Цитата Iska:
…нужно именно количество удалённых файлов? »
правильно мыслите, »
Примерно так:
читать дальше »
Код: Выделить весь код
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

Цитата Arsenik77:
лучше сделать чтоб лог записывался -1 (предыдущую) папку, »
Я не понял Вашу мысль. Поясните, пожалуйста, на примере.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:59, 20-07-2011 | #25


Пользователь


Сообщения: 72
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Iska:
Примерно так: »
нет список файлов не надо вообще, иногда он может быть ооочень большим.
Последний раз Ваш скрипт обработал 330 тыщ.файлов, удалив порядка 160 тыщи файлов.
Хотя если можно то ее можно оставить, включая или отключая её через ключ (параметр).
Можно добавить в логе писал: Total delete: YY file(s) из XXX файлов.

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

Последний раз редактировалось Arsenik77, 20-07-2011 в 10:25.


Отправлено: 09:24, 20-07-2011 | #26


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Arsenik77:
Хотя если можно то ее можно оставить, включая или отключая её через ключ (параметр).

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

Отправлено: 13:06, 20-07-2011 | #27


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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).
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:53, 08-08-2011 | #28



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Удаление одинаковых файлов Tonny_Bennet Программирование в *nix 3 14-12-2010 16:44
CMD/BAT - Удаление старых файлов по имени файлов Bиктор Скриптовые языки администрирования Windows 1 19-04-2010 03:37
CMD/BAT - [решено] Удаление одинаковых подпапок из родительской папки D_Master Скриптовые языки администрирования Windows 2 28-03-2009 15:08
удаление одинаковых папок в под папках clop1000 Хочу все знать 5 17-11-2007 00:51
Поиск одинаковых файлов Geo55 Программное обеспечение Windows 6 23-10-2004 10:01




 
Переход