Что нового

Помогите написать скрипт удаления файлов в разных папках на разных дисках

sanf

Новичок
Сообщения
30
Репутация
0
Помогите пожалуйста написать скрипт удаления файлов старше 6 дней, в разных папках на разных дисках. К примеру в папках backup на E: F: G:

Я руководствовался другим скриптом написаном на форуме, но я не пойму как сделать несколько переменных path:

Код:
#include <Date.au3>

$path = "G:\backup";папка для очистки
$delta = "6" ; кол-во дней, старше которых удаляем
$aReturn = _FileSearch($path, '*.*')

For $i = 1 To UBound($aReturn) - 1
    $aTime = FileGetTime($aReturn[$i])
    If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
        FileDelete($aReturn[$i])
    EndIf
Next

Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0" & @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "' & $sPath & '\' & $sFileMask & '" /S/B/A-D', @SystemDir, @SW_HIDE, 6)

    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    WEnd

    $aOut = StringRegExp(BinaryToString($sOut, 2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut) - 1
    Return $aOut
 EndFunc   ;==>_FileSearch
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
sanf
используй теги для оформления кода. вот так
Код:
$aArray = DriveGetDrive("fixed")
For $1i = 1 To UBound($aArray) - 1
	$aReturn = _FileSearch($aArray[$1i], "*", 1, 1)
	For $i = 1 To UBound($aReturn) - 1
                $aTime = FileGetTime($aReturn[$i])
		If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
			FileDelete($aReturn[$i])
		EndIf
	Next
Next

ну , вобщем , это и решение
 
Автор
S

sanf

Новичок
Сообщения
30
Репутация
0
мм либо я не туда тэг вставляю....либо я еще чтот не то делаю..., а что останется в $path ?
если вас не затруднит подскажите как будет выглядеть весь код
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
sanf

Код:
#include <Array.au3> ; это для _ArrayDisplay
$n=3 ; количество удаляемых файлов, он же влияет на размер массива
; Создание массива с путями
Global $FileList[$n+1] = [$n, _
'C:\file1', _
'D:\file2', _
'C:\fileN']

_ArrayDisplay($FileList, 'пути') ; это для просмотра массива перед тем как удалить
; Exit ; для теста массива без удаления

$err = '' ; это для лога ошибок, если не удалось удалить какой либо файл
For $i = 1 To $FileList[0]
	If Not FileDelete($FileList[$i]) Then
		If Not (FileSetAttrib($FileList[$i], '-RST') And FileDelete($FileList[$i])) Then
			$err &= $FileList[$i] & @CRLF
		EndIf
	EndIf
Next
If $err Then MsgBox(0, 'Ошибка', $err)


joiner
Опасный скрипт у вас, если ему дать волю удалит все файлы на дисках.
 

ssvih

Новичок
Сообщения
35
Репутация
1
Я руководствовался другим скриптом написаном на форуме, но я не пойму как сделать несколько переменных path:

Ваш path
Код:
$path = "G:\backup";папка для очистки


То что нужно вставить вместо
Код:
$path[4] = [3, 'C:\backup', D:\backup', E:\backup']
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
AZJIO
ну это да :smile:. но если нужно найти спец.файл, то пойдет, только указать имя файла вместо звездочки. если нет, то как и было показано через объявление массива.


Код:
Dim $path[4]
$path[1] = 'D:\backup\'
$path[2] = 'G:\backup\'
$path[3] = 'E:\backup\'

For $1i = 1 To UBound($path) - 1
	$aReturn = _FileSearch($path[$1i], "*", 1, 1)
	For $i = 1 To UBound($aReturn) - 1
		$aTime = FileGetTime($aReturn[$i])
		If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
			FileSetAttrib($aReturn[$i], '-RST')
			FileDelete($aReturn[$i])
		EndIf
	Next
Next


Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf

	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf

	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf

	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf

		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next

	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

	While ProcessExists($hDir)
		$sRead = StdoutRead($hDir, False, True)

		If @error Then
			ExitLoop
		EndIf

		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
		Sleep(10)
	WEnd

	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf

	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Видимо я ТЗ неправильно понял, вот подобный пример.

joiner
Зачем снимать атрибуты, если в 95% случаев атрибуты отсутствуют. А на снятие атрибутов тратится время.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
AZJIO
чтобы было, а вдруг есть атрибуты. можно и без них :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
joiner
Я не про то чтобы не использовать, я про то чтобы снимать атрибуты только в случае если файл не удалось удалить.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
сегодня был момент, когда нужно было снять атрибуты скрытый и для чтения со 100гб файлов. на стареньком пне с 512мб оперативы заняло секунд 20. снимал естественно похожим скриптом. диск был во внешнем боксе. много это или мало - не знаю.
в принципе можно вставить твой цикл на проверку существования атрибутов, но это тоже время. ну и как ты сказал, можно вообще обойтись без этого, если пользователь удаляет свои файлы, а не системные.
AZJIO
я ж не претендую на оригинальность или исключительную эффективность предложенного метода. то, о чем мы сейчас говорим это нюансы. думаю что ТС самому будет интересно разобраться в таких моментах и сделать улучшение.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
joiner
в моём варианте:
Если в каталоге преобладают файлы с атрибутами, то скрипт работает по схеме:
FileDelete, FileSetAttrib, FileDelete
если файлы преобладают без атрибутов, то скрипт работает по схеме:
FileDelete

В вашем варианте в любом случае
FileSetAttrib, FileDelete

Итог если файлов с атрибутами и без 50/50 то оба варианта отрабатывают одинаково. Но лично у меня даже в системной папке (WinXP) с большим приоритетом преобладают файлы без атрибутов (RST).
 
Верх