Что нового

Поиск и удаление файлов

prokazzza

Новичок
Сообщения
160
Репутация
2
Подскажите плиз функцию поиска и удаления файлов с одинаковым названием в многоуровневых подкаталогах.

К примеру найти на диске С:\ файл server.log и удалить их все.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Набери в командной строке
del /S C:\server.log
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
VladUs
А прочесть внимательно еще раз 1 сообщение??
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Код:
#Include <File.au3>

$Count = _DeleteFiles('C:', '*.log')
ConsoleWrite($Count & ' file(s) has been deleted' & @CR)

Func _DeleteFiles($sRoot, $sFile, $iCount = 0)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
;			FileDelete($sRoot & '\' & $FileList[$i])
            ConsoleWrite('Delete: ' & $sRoot & '\' & $FileList[$i] & @CR)
			$iCount += 1
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            $iCount += _DeleteFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
	Return $iCount
EndFunc   ;==>_DeleteFiles
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
prokazzza [?]
А прочесть внимательно еще раз 1 сообщение?
И что там? VladUs неплохое решение дал, запусти это из скрипта:

Код:
Run(@ComSpec & ' /C del /S "C:\server.log"', '', @SW_HIDE)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716

VladUs

Скриптер
Сообщения
621
Репутация
181
prokazzza [?]
А прочесть внимательно еще раз 1 сообщение??
А на чем именно я должен заострить внимание в первом сообщении ?
Команда del c ключем /S тем и занимается, что ищет указанный файл в указанном катологе и во всех подкаталогах.
Это можно легко превратить в функцию на Autoit. CreatoR чуть выше
дал пример
 
Автор
P

prokazzza

Новичок
Сообщения
160
Репутация
2
VladUs

Сорри не обратил внимание на ключ :-[.
А нет ли функции найти и заменить найденные server.log к примеру другим server.log

???
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
prokazzza [?]
А нет ли функции найти и заменить найденные server.log к примеру другим server.log
Попробуйте так:
Код:
$sFileReplase = 'Полный путь к файлу' ;файл на который будем менять все найденные
$sFolderSearch = 'Полный путь к папке' ;папка в которой будем искать, включая подпапки, и менять все найденные на $sFileReplase
$iCount = 0 ;счетчик замены

If Not FileExists($sFileReplase) Then
	MsgBox(16, 'Error', 'Не найден файл замены ' & $sFileReplase)
	Exit
EndIf
If Not StringInStr(FileGetAttrib($sFolderSearch), 'D') Then
	MsgBox(16, 'Error', $sFolderSearch & ' не папка')
	Exit
EndIf
$sFileName = StringRegExpReplace($sFileReplase, '^.*\\', '')
If @extended <> 1 Or Not $sFileName Then
	MsgBox(16, 'Error', 'Произошла непредвиденная ошибка')
	Exit
EndIf
$aSearch = _FileSearch($sFolderSearch, $sFileName, 1)
If @error Then
	MsgBox(16, 'Error', 'Произошла ошибка поиска файлов')
	Exit
EndIf
If $aSearch[0] Then
	For $i = 1 To $aSearch[0]
		If FileCopy($sFileReplase, $aSearch[$i], 1) Then
			$iCount += 1
		EndIf
	Next
Else
	MsgBox(16, 'Error', 'Не найдено файлов для замены')
	Exit
EndIf

MsgBox(64, 'Info', 'Успешно заменили файлов: ' & $iCount & ' из ' & $aSearch[0] & ' найденных')

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)
	;фильтры для поиска нужно указывать через ;
	;$i_Flag = 0 - Файлы и папки (по умолчанию)
	;$i_Flag = 1 - Только файлы
	;$i_Flag = 2 - Только папки
	;$i_SubDir = 1 - Искать во всех подкаталогах (по умолчанию). Возвращает полные пути.
	;$i_SubDir = 0 - Искать только в самой папке. Возвращает только имена файлов(папок).
	Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $a_Masks

	If StringRight($s_Path_Search, 1) == '\' Then ;нужно, если $s_Path_Search - диск (например C:\)
		$s_Path_Search = StringTrimRight($s_Path_Search, 1)
	EndIf
	If $i_SubDir Then
		$s_Subdir = ' /S /B'
	Else
		$s_Subdir = ' /B'
	EndIf
	Switch $i_Flag
		Case 1
			$s_Attrib = ' /A-D'
		Case 2
			$s_Attrib = ' /AD'
		Case Else
			$s_Attrib = ' /A'
	EndSwitch
	$s_Out = StringToBinary('0' & @CRLF, 2)
	$a_Masks = StringSplit($s_File_Mask, ';')
	For $i = 1 To $a_Masks[0]
		$h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
		If Not $h_Dir Then Return SetError(1)
		While 1
			$s_Read = StdoutRead($h_Dir, False, True)
			If @error Then
				ExitLoop
			EndIf
			If $s_Read <> "" Then
				$s_Out &= $s_Read
			EndIf
			Sleep(10)
		WEnd
	Next
	$a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
	If @error Then Return SetError(1)
	$a_Out[0] = UBound($a_Out) - 1
	Return $a_Out
EndFunc   ;==>_FileSearch
_FileSearch().
 
Верх