Что нового

[Файловая система] Удаление файлов по маске, дате и количеству файлов

NinjaScript

Новичок
Сообщения
3
Репутация
0
День добрый. :smile:

Использую AutoIt v 3.4.1

Имеется на bat скрипт, суть такова:
Находит файлы по маске (определенного слова имени и с определенным расширением) и удаляет старые, оставляя n последних файлов. После чего переименовывает расширение оставшихся файлов.
Заданные значения (размещение папки, в которой происходит поиск файлов; имя и расширение файла, по которым идет поиск; количество файлов, которые нужно оставить; конечное расширение) задаются параметрами при вызове bat файла.

Полученный батник был переконвертирован сторонними программами в exe, и тут возникали проблемы:
  • скрипт не работает после конвертации
  • на скрипт жалуются антивирусы (как позднее оказалось некоторые конвертаторы и вправду дописывали свой код в exe-шник

Необходимо осуществить то же самое в Autoit (с последующей конвертацией в exe). Серфинг интернетов показал, что прямой конвертации из bat в autoIt не имеется. Возможен вызов cmd команд, но, насколько я понял, только одиночных, что в моем случае не помогает.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
NinjaScript

Например, переделанный скрипт удаления старых папок:
Код:
#include <File.au3>
#include <Array.au3>

$sDir_Where_Search = 'C:\1'
$aTemp = _FileListToArray($sDir_Where_Search, '*', 1)

If @error Or (UBound($aTemp) - 1) < 50 Then Exit 13

Dim $aDir_and_Time[$aTemp[0] + 1][2] = [[$aTemp[0]]]

For $i = 1 To $aDir_and_Time[0][0]
	$aDir_and_Time[$i][0] = $aTemp[$i]
	$aDir_and_Time[$i][1] = FileGetTime($sDir_Where_Search & '\' & $aTemp[$i], 1, 1)
Next

$aTemp = 0
_ArraySort($aDir_and_Time, 1, 1, 0, 1)
;_ArrayDisplay($aDir_and_Time)

For $i = $aDir_and_Time[0][0] To 50 Step -1
	;ConsoleWrite($aDir_and_Time[$i][0] & ' ' & $aDir_and_Time[$i][1] & @CRLF)
	FileDelete($sDir_Where_Search & '\' & $aDir_and_Time[$i][0], 1)
Next

Удаляет файлы, оставляя 50 новейших


Еще можно посмотреть эту библиотеку для создания списка файлов:
http://autoit-script.ru/index.php?topic=14598.0
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
NinjaScript [?]
Возможен вызов cmd команд, но, насколько я понял, только одиночных
Да почему... Я вон пробовал через && объединять команды, и ничего, работает :smile:
Например:
Код:
#include "Encoding.au3" ; http://autoit-script.ru/index.php/topic,510.0.html
Global $pid, $sCommands, $str

$sCommands = "echo hello && " & _
		"echo. && echo world && " & _
		"echo. && " & _
		"echo ping yandex and google... && " & _
		"ping yandex.ru && ping google.ru && " & _
		"echo COMPLETE"

$pid = Run(@ComSpec & " /c " & $sCommands, "", @SW_SHOW, 6)
ProcessWaitClose($pid)
$str = StdoutRead($pid)
$str = _Encoding_866To1251($str)

MsgBox(0, "результат", $str)

msgbox_info.jpg
 
Автор
NinjaScript

NinjaScript

Новичок
Сообщения
3
Репутация
0
WSWR, спасибо за ответ.
WSWR сказал(а):
NinjaScript
Например, переделанный скрипт удаления старых папок
Я просматривал несколько подобных топиков.
В моем случае интересна реализация получения значений вводом параметров. Можно ли осуществить такое в autout? Чтобы я запускал скрипт (а в будущем exe), например, через командную строку, с параметрами. То есть в cmd.exe прописывал:
Код:
autoit.au3 d:\test\ full 7z 2 test
И у меня запускался скрипт autoit.au3, который считывал введенные параметры (которые обрабатываются в теле скрипта). То есть с параметрами введенными выше, скрипт бы осуществлял поиск в папке "d:\test\" файлов в имени которых есть слово "full" с расширением "7z", оставлял бы последние 2 файла, остальные удалял, а расширение этих двух файлов переименовывал в "test".
Выглядит, возможно, все это слишком замудренно, но мне и в правду нужен такой функционал :smile:

alex33
alex33 сказал(а):
NinjaScript [?]
Возможен вызов cmd команд, но, насколько я понял, только одиночных
Да почему... Я вон пробовал через && объединять команды, и ничего, работает :smile:
Спасибо! О такой возможности не знал. В теории это позволит "конвертировать" любой батник в autoit, если переписывать так каждую команду?

OffTopic:
madmasles
madmasles сказал(а):
OffTopic:
NinjaScript [?]
Использую AutoIt v 3.4.1
Поделитесь, а то у меня нет такой. :smile:
У меня ВИП-аккаунт очепятался :smile:. v 3.3.12.0
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
NinjaScript [?]
Можно ли осуществить такое в autout? Чтобы я запускал скрипт (а в будущем exe), например, через командную строку, с параметрами.
Да, такое возможно. СМ. справку Параметры командной строки (CMD).

NinjaScript [?]
В теории это позволит "конвертировать" любой батник в autoit, если переписывать так каждую команду?
Ну да.
 
Автор
NinjaScript

NinjaScript

Новичок
Сообщения
3
Репутация
0
Собственно, закончил работу над скриптом.

Его суть: находит файлы по маске (определенного слова имени и с определенным расширением) и удаляет старые, оставляя n последних файлов. Переименовывает расширение оставшихся файлов.
Заданные значения (размещение папки, в которой происходит поиск файлов; имя и расширение файла, по которым идет поиск; количество файлов, которые нужно оставить; конечное расширение) задаются параметрами при вызове скрипта или скомпилированного exe. При этом, если параметры не заданы, использует значения, заданные по умолчанию. Если требуется задать один или несколько параметров, остальные параметры можно обозначить символом "@", в таком случае они останутся заданными по умолчанию.

В конечном, работающем виде он выглядит так:

Код:
#include <Array.au3>
#include <File.au3>
;объявление задаваемых значений переменных по умолчанию
$Dest='d:\temp\' ; Путь, где хранятся файлы
$Name='*full*' ; Слово, содержащиеся в имени файлов
$Number= 3 ; Количество файлов, которые останутся после удаления
$Ext_first='7z' ; начальное расширение
$Ext_final='kek' ; конечное расширение
;объявление незадаваемых переменных
$Mask=$Name&'.'&$Ext_final

;Условие, определяющее, перейти сразу к функции сортировки-удаления-переименования (если параметры не заданы), или выполнить функцию
;присваивания переменным значений параметров
If $CmdLine[0]=0 Then
   sort_del_ren()
   Else
   havepar()
Endif

;Функция, выполняемая, если параметры для скрипта заданы.
;Если, параметр задан, присваивает переменной значение параметра,
;в противном случае пропускает переменную и проверяет следующую, по тому же принципу.
;После, запускает функцию сортировки-удаления-переименования
Func havepar()
    If Not ($CmdLine[1]=='@') Then
	  Global $Dest=$CmdLine[1]
   EndIf

   If Not ($CmdLine[2]=='@') Then
	  Global $Name=$CmdLine[2]
   EndIf

   If Not ($CmdLine[3]=='@') Then
	  Global $Number=$CmdLine[3]
   EndIf

   If Not ($CmdLine[4]=='@') Then
	  Global $Ext_first=$CmdLine[4]
   EndIf

   If Not ($CmdLine[5]=='@') Then
	  Global $Ext_final=$CmdLine[5]
     EndIf
   $Mask=$Name&'.'&$Ext_final ;необходимо переобъявление маски, если параметры заданы
   sort_del_ren()
EndFunc

;Функция сортировки-удаления-переименования
Func sort_del_ren()
   FileMove($Dest &'*.'& $Ext_first, $Dest &'*.'& $Ext_final) ;переимнование расширений файлов

   ;построение из списка файлов, найденных по маске, двухмерного массива со столбцами (имя, дата)
   Local $aFileColList = _FileListToArray($dest, $Mask, 1, True) ;(0 - файлы и папки, 1 - файлы, 2 - папки)
   if $aFileColList = 0 Then
   Return
   Else
   Local $aFileColList_2D[ $aFileColList[0]+1 ][2] = [[ $aFileColList[0] ]]
   For $i = 1 To $aFileColList[0]
   $aFileColList_2D[$i][0] = $aFileColList[$i]
   $aFileColList_2D[$i][1] = FileGetTime($aFileColList[$i], 0, 1) ;option 0 = (по умолчанию) время последней модификации )1 = время создания 2 = время последнего доступа
   ;в каком виде необходимо получить информацию 0 = (по умолчанию) вернуть массив, 1 = вернуть строку вида ГГГГММДДЧЧММСС
   Next
   ;сортировка и удаление лишних старых файлов
   $aFileColList = 0
   _ArraySort($aFileColList_2D, 1, 1, 0, 1) ;сортировка массива (1 - по убыванию, 1 - Индекс массива, от которого начинать сортировку, 0 - Индекс массива, в котором закончить сортировку, 1 - Индекс колонки, по которой сортировать в двумерном массиве)
   $UB = UBound($aFileColList_2D) - 1
   For $i = $Number + 1 To $UB
   FileRecycle($aFileColList_2D[$i][0])
   Next
   EndIf
   EndFunc


Огромное спасибо всем откликнувшимся :smile:
 
Верх