Войти

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

amel27
19-08-2007, 03:08
Creat0R
еще немного поразмыслил - про "+" я пожалуй не прав (были и другие варианты) - если поставить "*" функция должна корректно отрабатывать @LF/@CRLF, ну а про @CR я уже сказал... Кстати, из каждой пары одинаковых строк остается первая а вторая удаляется, если нужно наоборот достаточно поменять подстановку "\1\2" на "\2\1".

Maza Faka
19-08-2007, 08:01
amel27
Откуда такие познания в синтаксисе регулярных выражений? Может FAQ есть какой подробный?

Creat0R
19-08-2007, 08:14
amel27,
Вобщем видимо это оптимальный вариант, без никаких массивов, и сторонних библиотек:


$File = "C:\Test.txt"

$Ret = _FileDeleteDuplicates($File, -1)

If $Ret = 1 Then
MsgBox(64, "Results", "Was deleted <" & @extended & "> duplicates in file [" & $File & "]")
ElseIf @error Then
MsgBox(48, "Error", "File [" & $File & "] was not found.")
EndIf

Func _FileDeleteDuplicates($sFile, $sDirection=-1)
If Not FileExists($sFile) Or StringInStr(FileGetAttrib($sFile), "D") Then Return SetError(1, 0, 0)

Local $FileStr = FileRead($sFile), $FileHasEndCRLF = True, $Extended = 0
Local $ReplDirectVal = '\1\2'
If $sDirection <> -1 Then $ReplDirectVal = '\2\1'

If StringRight($FileStr, 2) <> @CRLF Then
$FileStr &= @CRLF
$FileHasEndCRLF = False
EndIf

Do
$FileStr = StringRegExpReplace($FileStr, '(?s)(?m)(^[^\n]+\n)(.*?)(^\1)', $ReplDirectVal)
$Extended += @extended
Until @extended = 0
If $Extended = 0 Then Return SetExtended(0, 0)

If Not $FileHasEndCRLF Then $FileStr = StringTrimRight($FileStr, 2)

Local $hFile = FileOpen($sFile, 2)
FileWrite($hFile, $FileStr)
FileClose($hFile)
Return SetExtended($Extended/2, 1)
EndFunc



Maza Faka
Может FAQ есть какой подробный?
Есть тут что-то: http://shop.piter.com/lib/978531800056/regvir.phtml
И вот ещё ресурс посвящённый RegExp (http://regexp.by.ru/other/lex.html).

amel27
19-08-2007, 10:45
Creat0R
видимо это оптимальный вариантНу ты прям почти все учел. ;) Кстати, в RegExp-шаблоне последние скобки можно опустить (подстановка "\3" не используется, они у меня от отладки остались) - это должно немного ускорить обработку.

Maza Faka
Откуда такие познания в синтаксисе регулярных выражений?почти все мои познания из книжки по первому линку Creat0R'а... правда у меня вторая редакция - там примеров побольше... к сожалению, только в бумажном варианте.

Maza Faka
19-08-2007, 11:37
amel27, Creat0R,
почти все мои познания из книжки по первому линку Creat0R'а
Уже скачал, в DJVU-формате :)

amel27
Сохранил весь топик в версии для печати и изучаю. Наткнулся на твой скрипт(я его немного изменил, вернее упростил для себя):
Вот так работает:

$Dir2 = LinesDelete("c:\dir2\xxx.sif", "text_1")

Func LinesDelete($path, $string)
Local $StrArray
_FileReadToArray($path, $StrArray)
For $i = $StrArray[0] To 1 Step -1
If StringInStr($StrArray[$i], $string) Then _ArrayDelete($StrArray, $i)
_FileWriteFromArray($path, $StrArray, 1)
Next
EndFunc


А вот так выдаёт ошибку, хотя тоже отрабатывает:

Func LinesDelete($path, $string)
Local $StrArray
_FileReadToArray($path, $StrArray)
For $i = 1 To $StrArray[0] Step 1
If StringInStr($StrArray[$i], $string) Then _ArrayDelete($StrArray, $i) ;Здесь выдаёт ошибку
_FileWriteFromArray($path, $StrArray, 1)
Next
EndFunc

Можешь обьяснить почему?

13ghost
19-08-2007, 19:55
Всем здравствовать!!!
Вопрос такой,как с помощью АвтоИт сравнить дату создания двух файлов.С ехе файлами проше,их я сравниваю при помощи FileGetVersion (),но мне надо сравнивать не только ехе ,но и
другие типы файлов.Подскажите что-нибудь или ссылку дайте где можно почитать.Спасибо

Алексей Н.
19-08-2007, 21:57
13ghost
В скриптовом языке AutoIt есть функция FileGetTime, с помощью которой можно получить информацию о дате и времени последней модификации указанного файла.
Поробнее можно посмотреть в справке.
Узнать именно дату создания файла вряд ли возможно. Так как она храниться не в файлах, а служебных таблицах ОС.

Creat0R
19-08-2007, 22:09
amel27, в RegExp-шаблоне последние скобки можно опустить

Т.е так:

'(?s)(?m)(^[^\n]+\n)(.*?)^\1'

?

Или вовсе убрать (^\1)? хотя так не работает :) - цикл не прерывается.

к сожалению, только в бумажном варианте.
Вот кажется второе изданеие тоже в формате djvu - http://www.softtime.ru/info/fridl.php

А тут (http://www.google.ru/search?q=regexp&hl=ru&lr=lang_ru&newwindow=1&start=10&sa=N) вообще этого добра полно ;)

Maza Faka,
А вот так выдаёт ошибку
В этом случае массив обрабатывается с начала к концу, поэтому при удалении элемента (_ArrayDelete()), массив уменьшается, хотя обработка задана по последнему его значению (до входа в цикл). Поэтому ошибка происходит когда в цикле досигается не существующий элемент массива (удалённый).
Для этого и потребовалось перербирать массив с конца к началу (For $i = $StrArray[0] To 1 Step -1), где будут проверяться меньшие элементы, в данном случае ошибки быть не может.

Алексей Н., Узнать именно дату создания файла вряд ли возможно
Ну почему, есть ведь флаг 1...

[optional] Flag to indicate which timestamp
0 = Modified (default)
1 = Created
2 = Accessed


$FileTimeArr = FileGetTime(@SystemDir & "\Notepad.exe", 1)

MsgBox(64, "Results", "Create Date/Time is:" & @LF & _
$FileTimeArr[2] & "/" & $FileTimeArr[1] & "/" & $FileTimeArr[0] & ", " & _
$FileTimeArr[3] & ":" & $FileTimeArr[4] & ":" & $FileTimeArr[5])

mikola1983
20-08-2007, 06:51
Доброго времени уважаемые...нет ли какой нибуть возможности сделать автоустановку приложения пользователем без прав, если ему надо устанавливает, нет удаляет... возможно ли как нибуть зашить в код строчку типа RunAs

Maza Faka
20-08-2007, 08:08
Creat0R
В этом случае массив обрабатывается с начала к концу, поэтому при удалении элемента (_ArrayDelete()), массив уменьшается, хотя обработка задана по последнему его значению (до входа в цикл). Поэтому ошибка происходит когда в цикле досигается не существующий элемент массива (удалённый).
Значит, как я понял, когда массив обрабатывается с начала к концу, то после удаления элемента (_ArrayDelete()), меняется размерность массива ($StrArray[0]), а в цикле идёт обращение к прежней размерности массива, поэтому возникает ошибка?

Ну почему, есть ведь флаг 1...
Цитата AutoIt3.chm:[optional] Flag to indicate which timestamp
0 = Modified (default)
1 = Created
2 = Accessed
Вот млин, а в русской справке такого нет :(, когда нужно было, я мучился, прикручивал батник.

Maza Faka
20-08-2007, 08:30
mikola1983


If Not IsAdmin() Then
RunAsSet('USER', @Computername, 'PASSWORD')
Run("C:\Program\program.exe")
Exit
EndIf

Creat0R
20-08-2007, 09:35
Maza Faka,
после удаления элемента (_ArrayDelete()), меняется размерность массива ($StrArray[0]), а в цикле идёт обращение к прежней размерности массива, поэтому возникает ошибка?
Да, всё верно, кстати, размерность меняется, но в отличие от твоего примера в скобках, нулевой элемент может и не содержать этих данных , проверяется как по Ubound()-1 ;)

в русской справке такого нет
Я давно пришёл к выводу, что оригинал всегда надёжнее, при переводе можно что-то упустить, что то забыть, не так уж и прост весь процесс перевода, особенно такого файла как справка по AutoIt :)

Но тут конечно нужны знания (основные) Английского, хотя куда без них учиться программировать ;)

amel27
20-08-2007, 11:12
Т.е так:
Код:
'(?s)(?m)(^[^\n]+\n)(.*?)^\1'угу, теоретически на сохранение скобок тратится какое-то время

Можешь обьяснить почему?ну, CreatOR уже все объяснил... могу только предложить как альтернативу RegExp-вариант:Func _LinesDelete ($text, $string)
If StringRight($text,2)<>@CRLF Then $text &= @CRLF
$string = StringRegExpReplace($string, '([][^()?.|{}*+\\])', '\\\1')
Return StringRegExpReplace($text, '(?m)(?i)^'& $string &'[\r\n]+', '')
EndFunc

mikola1983
20-08-2007, 15:31
Maza Faka,

If Not IsAdmin() Then
RunAsSet('a.pupkin', 'trew', '123qwe')
Run('\\Distr\XnView-win.exe')
Exit
EndIf
MsgBox(0, 'Message', 'Now running with admin rights.')

не хочет работать .в чем проблемма?

spooll
20-08-2007, 16:05
Creat0R,

Лично на моем компе, хоть тресни, но виснет в этом моменте
WinWait("Выбор программной группы", "Выберите из существующих или")
ControlClick("Выбор программной группы", "", "Button2") (см скрин)

Тот что ты предложил с .

Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", -3)
Opt("WinTextMatchMode", 2)

Зависает на первом же окне :(((

WinWait("Добро пожаловать", "&Далее >")
ControlClick("Добро пожаловать", "&Далее >", "Button1")

приложу скрин этих окон с AutoIT info.

если все верно и не ясно почему не работает, я пойду повешусь и не буду больше доставать, но может я че не так делаю?!

Maza Faka
20-08-2007, 16:32
mikola1983
Run('\\Distr\XnView-win.exe')
Попробуй прописать полный путь к запускаемому файлу.

Maza Faka
20-08-2007, 16:53
Почему функция возвращает переменную $count равную нулю, хотя файлы были найдены и удалены? Сначала я подумал, что это происходит если существуют подкаталоги, так, как при нахождении каталога функция вызывает саму себя и соответсвенно снова происходит декларирование переменной: Local $count = 0, но удалив подкаталоги, я обнаружил, что проблема не исчезла, функция всё так же возвращает переменную $count равной нулю. Я понимаю, что это даже не проблема, так как переменную можно обьявить вне функции и тогда счётчик будет приращиваться, но всё же интересно, почему так происходит?


Dim $delFile[3] = [2, "soccer5.bmp", "soccer9.bmp"], $path[3] = [2, "c:\test", "c:\1"]

For $p = 1 To $path[0]
For $f = 1 To $delFile[0]
$Del = DeleteFile($path[$p], $delFile[$f])
Next
Next
MsgBox(64, "Result", $Del)

Func DeleteFile($path, $delfile)
Local $count = 0
$search = FileFindFirstFile($path & "\*.*")
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$Full_file = $path & "\" & $file
If FileGetAttrib($Full_file) = "D" Then
DeleteFile($Full_file, $delfile)
ElseIf $file = $delFile Then
If FileDelete($Full_file) Then $count += 1
EndIf
WEnd
FileClose($search)
Return $count & " files deleted"
EndFunc

Creat0R
20-08-2007, 17:52
spooll, виснет в этом моменте
Значит пробуй так:

Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", -2)
Opt("WinTextMatchMode", 2)

WinWait("Выбор программной группы", "Папки с Программами:")

...


Текст лучше подбирать полный.
Если программа 1c небольшая, залей куда нибудь (или дай линк на неё), попробую потестить у себя.

Maza Faka, Почему функция возвращает переменную $count равную нулю, хотя файлы были найдены и удалены? Сначала я подумал, что это происходит если существуют подкаталоги, так, как при нахождении каталога функция вызывает саму себя и соответсвенно снова происходит декларирование переменной: Local $count = 0, но удалив подкаталоги, я обнаружил, что проблема не исчезла, функция всё так же возвращает переменную $count равной нулю.
Именно потому, что в начале функции обнуляется переменная $count...

На мой взгляд тут есть два варианта решения - 1) Проверять не обьявлена ли уже переменная (If Not IsDeclared($count) Then Local $count = 0), 2) (более правильный) - добавлять к $count возвращённое значение от повторного вызова функции DeleteFile()...


Dim $delFile[3] = [2, "soccer5.bmp", "soccer9.bmp"], $path[3] = [2, "c:\test", "c:\1"]

For $p = 1 To $path[0]
For $f = 1 To $delFile[0]
$Del = DeleteFile($path[$p], $delFile[$f])
Next
Next
MsgBox(64, "Result", $Del & " files deleted")

Func DeleteFile($path, $delFile)
Local $count = 0
$search = FileFindFirstFile($path & "\*.*")
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$Full_file = $path & "\" & $file
If FileGetAttrib($Full_file) = "D" Then
$count += DeleteFile($Full_file, $delFile)
ElseIf $file = $delFile Then
$count += FileDelete($Full_file)
EndIf
WEnd
FileClose($search)
Return $count
EndFunc

spooll
20-08-2007, 18:25
Creat0R
весит 27 мб, желательно опробовать на паре компов(или несколько раз), т.к слабые у нас грузят окна бывает порядком больше времени, но что характерно, даже если убрать время, то при появлении окна всеравно ничего не происходит =\
http://www.rapidshare.ru/376488
заранее большое спасибо ;)

Maza Faka
20-08-2007, 19:04
Creat0R
На мой взгляд тут есть два варианта решения - 1) Проверять не обьявлена ли уже переменная (If Not IsDeclared($count) Then Local $count = 0), 2) (более правильный) - добавлять к $count возвращённое значение от повторного вызова функции DeleteFile()...

Первый вариант я попробовал сразу же, как обнаружил проблему с приращением счётчика, не помогло, сейчас попробовал 2-ой вариант, тоже не работает. Интересная задачка :)




© OSzone.net 2001-2012