Войти

Показать полную графическую версию : [Архив - Часть 3] 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 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

SyDr
16-11-2008, 11:27
$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) ".*?"', '/$1 %s')

Символы повтора (*, +, ?, {...} ) предписывают поиск наибольшего из подходящих фрагментов, если сразу вслед за этими символами не задан знак вопроса. В последнем случае будет предписывается поиск самого короткого по длине фрагмента, который совпадает с заданным шаблоном.

$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) (\S)*', '/$1 %s ')

Maza Faka
16-11-2008, 11:33
И ещё задача по RegExp »
Вроде работает:

$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'

$sCompile_String = StringRegExpReplace($sCompile_String, '(/[\w-]*)\s("?[\w-]*"?)', '\1 %s')

ConsoleWrite($sCompile_String & @CRLF)

Creat0R
16-11-2008, 13:49
Sylver Dragon, Maza Faka,
Спасибо, оба варианта работают на ура (первый конечно по проще :tongue: ), а я столько мучался :dont-know ...

SyDr
16-11-2008, 14:04
Ааааа... Мой вариант немного неправильный. Строку вида '/In "Yes, Right" /Icon "No" /Bin "Ok" /Comp 1' обработать правильно не сможет. С пробелами всмысле.

Можно так тогда переписать:
$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) ([^/])*', '/$1 %s ')
Однако строку вида '/In array "Yes, Right" /Icon, or not icon "No" /Bin "Ok" /Comp 1' Он всё равно обработать не сможет. Хотя впринципе такую строку ничто не сможет обработать. Нужны будут какие-то спец. символы, чтобы выделять нужные куски.

Creat0R
16-11-2008, 14:14
Sylver Dragon, Строку вида '/In "Yes, Right" /Icon "No" /Bin "Ok" /Comp 1' обработать правильно не сможет »
Ну, оно по сути и не нужно, мне заранее известен формат строки, он именно таков как я и привёл в своём посте :) - Т.ч мне первый вариант очень даже подходит, спасибо.

P.S
Вот если бы ещё с первой проблемой (http://forum.oszone.net/post-953351.html#post953351) разобраться :durak: ...

SyDr
16-11-2008, 14:42
StringRegExp($Clip, '(\a:\\)([^/\\<>:*?"|])*\.(txt|txt\.bk)(\n|$)')

Пока не проверял. Поясню немного:
([^\\/<>:*?"|])* - означает наличие любых символов, кроме тех, которые не могут присутствовать в имени файла. Надеюсь, что правильно записал выражение. Хотя если в буфере будет что-то типа: D:::\Bla\Text.txt - правильно обравботать не получиться.
Ну, я не думаю, что кто-то будет так маньячиться.
Щас немного потестирую.

Стоп. пути только полные, или могут быть относительные?

Пока не работает. Даже понял, почему :) Сменились значения спец. символов. Придёться с английской справкой работать((

[HR]
Я немножко в ступоре))
StringRegExp($Clip, '\b:\\([^\\/<>:*?|])*')) - вот это проверит, может ли являеться ли $Clip путём к файлу. Однако расширение она учесть не сможет (точки могут быть в любом месте файла). Это уже надо сильно усложнять выражение, что приведёт к увеличению времени обработки. А это здесь явно не нужно.
Щас буду думать дальше.

И ещё, как вариант, проверять, путь ли в буфере, не во время вызова контекстного меню, а регулярно, во время работы программы. Т. е. если буфер изменился - проверить, путь ли в нём теперь.
[HR]
Я дурак. Поставил в регулярное выражение символ \ и думаю, почему неправильно обрабатывает...
[HR]
Всё. Вот моё окончательное слово:
StringRegExp($Clip, '\b:\\([^/<>:*?|])*(\.txt|txt\.bk)(\n|$)')

P. S. Только для полных путей.

Creat0R
17-11-2008, 03:19
Sylver Dragon, пути только полные, или могут быть относительные? »
Полные, ClipGet() возвращает полные пути скопированных файлов (из проводника).

как вариант, проверять, путь ли в буфере, не во время вызова контекстного меню, а регулярно, во время работы программы »
Вариант был расмотрен ранее, он не подходит, это нагрузка на главный цикл, и занимает лишние мегабайты памяти :(

Вот моё окончательное слово »
Спасибо, но оно не работает как надо:

$Clip = _
"C:\Testing\SomeFile.txt" & @LF & _
"Testing\OtherFile.txt"

;$Clip = ClipGet()

$sExt_Pattern = '\.txt|\.txt\.bk' ;Файлы ещё могут иметь расширение txt.bk (обязательно вместе)
$iEnable_Paste_Item = StringRegExp($Clip, '\b:\\([^\/<>:*?|])*(' & $sExt_Pattern & ')(\n|$)')

MsgBox(0, "", "$iEnable_Paste_Item = " & $iEnable_Paste_Item)

Возвращает 1, хотя втрой путь совсем не путь к файлу.

amel27
17-11-2008, 06:26
Creat0R
Pattern для проверки содержимого б. обмена на присутствие путей к файлам »
скорость и глубина проверки противоречат друг другу, четыре разных варианта:
#Region : Построение регулярного выражения
$ExpandVarStrings = Opt("ExpandVarStrings", 1)

$extn = "(?:\.txt|\.txt\.bk)"
; диск ("C:")
$disk_1 = ".:"
$disk_2 = "[a-z]:"
; UNC путь (\\server-1.domain.local)
$host_1 = "\\\\[-\w.]+"
$host_2 = "\\\\[-\w]+(?:\.[-\w]+)*"
; корень пути (все возможные варианты)
$root_1 = "(?:$disk_1$|$host_1$)"
$root_2 = "(?:$disk_2$|$host_2$)"
; путь без корня, включая имя файла
$path_1 = ".*"
$path_2 = "(?:\\[^\n\\]+)+"
; путь без корня, без имени файла
$path_3 = "\\(?:[^\n\\]+\\)*"
; только имя файла без пути
$name_3 = ".+$extn$"
$name_4 = "[^\n\\]+$extn$"
; одна строки списка файлов
$line_1 = "$root_1$$path_1$$extn$"
$line_2 = "$root_2$$path_2$$extn$"
$line_3 = "($root_2$$path_3$)$name_3$"
$line_4 = "($root_2$$path_3$)$name_4$"
; варианты выражений с разной детализацией
$RegExp_1 = "(?i)^(?:$line_1$(?:\n|$$))+$$"
$RegExp_2 = "(?i)^(?:$line_2$(?:\n|$$))+$$"
$RegExp_3 = "(?i)^$line_3$(?:\n\1$name_3$)*$$" ; файлы с одного ресурса (один путь)
$RegExp_4 = "(?i)^$line_4$(?:\n\1$name_4$)*$$" ; файлы с одного ресурса (один путь)

Opt("ExpandVarStrings", $ExpandVarStrings)
#EndRegion

$sClip = ClipGet()
ConsoleWrite($sClip &@CRLF&@CRLF)

ConsoleWrite(StringRegExp($sClip,$RegExp_1) &': "'& $RegExp_1 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_2) &': "'& $RegExp_2 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_3) &': "'& $RegExp_3 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_4) &': "'& $RegExp_4 &'"'&@CRLF)
И ещё задача по RegExp »
$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'
$sCompile_String = StringRegExpReplace($sCompile_String,' +("[^"]*"|[^/ ]+)',' %s')

ConsoleWrite($sCompile_String & @CRLF)
P.S. Вроде таких еще не было :)

Creat0R
17-11-2008, 13:29
amel27,
скорость и глубина проверки противоречат друг другу, четыре разных варианта »
Ухты, такие выражения я ещё не видел :o :biggrin:

По поводу скорости, мне главное чтобы если первая строка не совпадает с запросом, то проверка заканчивалась. Моя первая попытка сделать пдобную проверку, очень долго возвращала результат в случае если б.обмена содержал большой кусок текста (не пути к файлам).

P.S
Победители конкурса по Регулярным выражениям становятся... RegExp номер 3 и номер 4! http://files.myopera.com/Creat0R/Opera_AC/Icons/Kolobki/crazy.gif :clapping:

Вроде таких еще не было
Выражении, или задач? :rolleyes:

SyDr
17-11-2008, 21:00
Спасибо, но оно не работает как надо »
Просто я плохо проверял, прежде чем написать... :sorry:

Возвращает 1, хотя втрой путь совсем не путь к файлу. »
Это тоже путь к файлу. Просто относительный. Хотя в случае копирования из проводника такой ситуации быть не может.

[HR]

А как насчёт того, чтобы проверять не во время вызова контекстного меню, а прямо перед вставкой? Т. е. если содержимое буфера не соответсвует шаблону - выдать сообщение об этом...

[HR]

По поводу скорости, мне главное чтобы если первая строка не совпадает с запросом, то проверка заканчивалась. Моя первая попытка сделать пдобную проверку, очень долго возвращала результат в случае если б.обмена содержал большой кусок текста (не пути к файлам).

Ещё один вариант - разбить всю строку на массив (разделитель @LF). И проверять каждый элемент - являеться ли он путём к файлу. Ведь чем короче строка - тем быстрее она проверяеться на соотвествие шаблону (так ведь?).
Плюс ещё сделать предположение, что если первые несколько строк - пути к файлам, значит и всё остальное тоже.

Creat0R
17-11-2008, 22:25
Sylver Dragon,
как насчёт того, чтобы проверять не во время вызова контекстного меню, а прямо перед вставкой? »
Дело в том, что вся эта затея нужна для активирования/деактивирования пункта меню. Если буфер обмена позволяет вставить файлы, то при открытии меню пункт должен быть активен (GUISetState($Item, $GUI_ENABLE)), если вставка невозможна, то пункт следует деактивировать ($GUI_DISABLE).

P.S
В принципе (это я только щас додумал), достаточно лишь проверять расширение файлов, т.к у меня есть ещё и проверка типа данных содержащихся в буфере обмена (DROPEFFECT_COPY/MOVE).

amel27
18-11-2008, 03:36
Creat0R
такие выражения я ещё не видел »большие выражения сложно контролировать, подстановки переменных существенно упрощают эту задачу
...хотя в итоговый скрипт можно включать только результат ;)
Победители конкурса по Регулярным выражениям становятся... RegExp номер 3 и номер 4! »там есть оптимизация - путь обсчитывается только один раз в первой строке, далее обрабатываются только имена файлов
достаточно лишь проверять расширение файлов, т.к у меня есть ещё и проверка типа данных содержащихся в буфере обмена »главное вспомнить вовремя :lol:, тогда тебе хватит "^.*$extn$(?:\n.*$extn$)*$$" :)
жаль, нельзя сходу отличить файл от каталога, диска или другого элемента "сетевого окружения" ;)

amel27
18-11-2008, 13:05
нельзя сходу отличить файл от каталога, диска или другого элемента "сетевого окружения" »склероз однако... =) согласно этому (http://forum.oszone.net/post-621624-223.html) посту наверное все-таки можно... во всяком случае попробовать

Creat0R
18-11-2008, 14:12
согласно этому посту наверное все-таки можно »
Кстати, я тут немного переделал функцию _FileSFCallbackProc, чтобы при выборе папки её полный путь отображался в строке под Prompt. Но проблема в том, что если путь слишком длинный, то он обрывается. Я это решил следующей функцией:

ControlSetText($hWnd, "", "Static1", $sPromptData & @CRLF & @CRLF & _GetShortString($sSetData, 50))

Func _GetShortString($sString, $iMax_Ret_Lenght=30)
If StringLen($sString) < $iMax_Ret_Lenght Then Return $sString

If $iMax_Ret_Lenght <= 4 Then $iMax_Ret_Lenght = 5
Local $iSide_Lenght = Round(($iMax_Ret_Lenght / 2) - 2, 0)

Local $sLeft_Side = StringStripWS(StringLeft($sString, $iSide_Lenght), 3)
Local $sRight_Side = StringStripWS(StringRight($sString, $iSide_Lenght), 3)

Return $sLeft_Side & "...." & $sRight_Side
EndFunc

Внимание вопрос: Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами?

leprecon
18-11-2008, 18:15
Можно ли через autoit изменить реестр в ограниченой учетной записи?

SyDr
18-11-2008, 19:31
Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами? »
$Number = 30
$Array = StringRegExp($Expr, '^(.){' & $Number & '}',2)
$Array[0] - первые $Number символов строки. Если длина строки меньше $number - значение @error = 2 (А Array[0] - ХЗ, пустая строка вроде).

Можно ли через autoit изменить реестр в ограниченой учетной записи? »
Можно. Все те разделы, в которых при этом разрешена запись.
Если же нужна запись во все разделы - используй что-нибудь типа:

If $CmdLine[1] = "/NeedAdmin" Then
$sUserName = "Username"
$sPassword = "Password"
$FileToRun = "ThisExe.exe"
RunAs($sUserName, @ComputerName, $sPassword, 0, $FileToRun)
Exit
EndIf
; Начало основного сценария

Grammaton Cleric
19-11-2008, 07:50
Такая вот проблема...
Есть текстовый файл, например test.txt, в котором содержится:
[19.11.08 07:51:20] Регистрация пользователя OPERATOR
[19.11.08 07:51:24] [4] cryptoserver authentication: one-way mode.eG#I
[19.11.08 07:51:25] Время сервера 19.11.2008 1:53:25
[19.11.08 07:51:28] OK:[3] valid O/R name.
[19.11.08 07:51:28] Доступ разрешен
[19.11.08 07:51:28] Просмотр исходящих файлов
[19.11.08 07:51:29] Отправка файла 47D43E1ANL18170549906E.XXX
[19.11.08 07:51:31] OK:All letters send successfully.
[19.11.08 07:51:31] Просмотр входящих файлов
[19.11.08 07:51:33] Нет входящих сообщений
[19.11.08 07:51:35] Сессия завершена
[19.11.08 11:08:12] Регистрация пользователя ws05285o
[19.11.08 11:08:16] [4] cryptoserver authentication: one-way mode.‰u#I
[19.11.08 11:08:17] Время сервера 19.11.2008 5:10:17
[19.11.08 11:08:20] OK:[3] valid O/R name.
[19.11.08 11:08:20] Доступ разрешен
[19.11.08 11:08:20] Просмотр исходящих файлов
[19.11.08 11:08:21] Отправка файла 9FBD57C0NL19110805312E.XXX
[19.11.08 11:08:23] OK:All letters send successfully.
[19.11.08 11:08:23] Просмотр входящих файлов
[19.11.08 11:08:26] Прием файла NKTF1027.000
[19.11.08 11:08:27] OK:message was successfully deleted from queue..
[19.11.08 11:08:29] Прием файла NKTF1030.000
[19.11.08 11:08:31] OK:message was successfully deleted from queue..
[19.11.08 11:08:33] Нет входящих сообщений
[19.11.08 11:08:35] Сессия завершена
Размер файла регулярно увеличивается... Надо проверить в файле наличие "OK:All letters send successfully" (без кавычек). А если реально, то и вернуть количество этих вхождений....
Тока напишите, пожалуйста, небольшое пояснение. А то хочется не просто тупо использовать кусок кода, но и понять КАК он работает....

Maza Faka
19-11-2008, 09:17
Такая вот проблема »
Попробуй так:
$sFile = @ScriptDir & "\test.txt"
$sRead = FileRead($sFile)

$aString = StringRegExp($sRead, "(?i)OK:All letters send successfully", 3)
If @error Then
MsgBox(48, "Test.txt", "Совпадений не найдено")
Exit
EndIf

MsgBox(64, "Test.txt", "Найдено " & UBound($aString) & " совпадений")

amel27
19-11-2008, 12:01
Creat0R
Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами? »
Нет, одними нельзя - входными данными для регулярных выражений является сам текст, в твоем случае как раз наоборот - форматирование абсолютно не зависит от содержания самой строки, оно определяется длиной строки, длиной контрола, длиной вставки ("..."), на основании этих ГЛОБАЛЬНЫХ (по отношению к тексту) параметров рассчитываются длины левого и правого куска. RegExp же, являясь конечным автоматом, "мыслит" ЛОКАЛЬНО - в процессе "раскрутки" выражения он не знает какой текст его ждет впереди, сколько ему еще до конца строки, не помнит даже того текста, который им уже обработан... за исключением, пожалуй, выставленных "групп захвата". Конечно, можно заменить StringLeft() и StringRight() на StringRegExpReplace(), но выгода от этого сомнительна.

По ходу немного переделал твой UDF, стабилизировав длину выходной строки (имеет смысл только для непропорционального шрифта типа Courier) и добавил возможность смещения заполнителя в правую или левую сторону... Вариант для RegExp прилагается, но он некорректно обрабатывает нулевую длину $iLeft и $iRight:
$s = "C:\Documents and Settings\Администратор\Рабочий стол\Текстовый документ.txt"
$s = _GetShortString($s, 30, -11)

ConsoleWrite('"'&$s&'"' &@CRLF)
ConsoleWrite("Output Length: "& StringLen($s) &@CRLF)

Func _GetShortString($sString, $iMaxRetLen = 30, $iShift = 0)
Local $iString = StringLen($sString)
If $iString <= $iMaxRetLen Then Return $sString

Local $sMidl= "...", $iMidl = StringLen($sMidl)
Local $iCut = $iString - $iMaxRetLen
If $iCut<$iMidl Then $sMidl=StringLeft($sMidl, $iCut)

$iMaxRetLen -= $iMidl
If $iMaxRetLen <0 Then $iMaxRetLen = 0

Local $iEven = BitShift($iMaxRetLen,1)
If $iShift> $iEven Then $iShift= $iEven
If $iShift<-$iEven Then $iShift=-$iEven
Local $iLeft = $iEven+$iShift+BitAND($iMaxRetLen,1)
Local $iRight= $iEven-$iShift

; $sString = StringRegExpReplace($sString, "(.{"& $iLeft &"}).*(.{"& $iRight &"})", "\1"& $sMidl &"\2")
$sString = StringLeft($sString,$iLeft) & $sMidl & StringRight($sString,$iRight)

Return $sString
EndFunc

EgOrus
19-11-2008, 14:49
Здравствуйте наблюдается проблемма на Vista 32 Ultimate при отработке команды Ping(), назависимо от состояния сети всегда выдает время отклика равное 1, тот же скрипт на Windows XP работает как надо. Втроенный брэндмауэр, Defender и т.п. отключены. Сеть и инет работает как надо. Может у кого-то будут мысли куда копать?
вот такой простенький скрипт
$var = Ping("192.168.1.1")
While 1
If $var Then
MsgBox(4096, 'Сообщениe', 'Подключен. ' & $var)
ExitLoop
Else
MsgBox(4096, 'Сообщениe', 'Не подключен. ' & $var & ' ' & @error)
sleep(2000)
EndIf
Wend




© OSzone.net 2001-2012