PDA

Показать полную графическую версию : [архив - Часть 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

SvetlanaK
14-08-2007, 10:27
Maza Faka, Sanja Alone,
к сожалению эксель появляется открыто, "мелькает" так сказать...потому что файл появляется в результате принудительной выгрузки из другой программы (та программа так делает, по-другому никак).
вот и висит этот листик на экране, и сохранить его в нужное место с нужным именем и закрыть- задача номер один....
спасибо за подсказку, Objekt - это интересная идея, но результат выполнения такого скрипта - "лежащее " окно "сохранение документа":( , и вытящить его на поверхность чтобы ввести наконец нужное имя файла никак не удается(((
и еще в связи с этим, в вашем примере $sFilePath = 'D:\MyDoc\Sample.xls' ;путь файла для выполнения действий над ним
непонятно , а каком месте оно применимо( ведь команда Save не предполагает опций - куда и с каким именем...
в англоязычном хелпе ничего не нашлось по этому поводу(((
Спасибо за ответ.

Creat0R, не работает этот вариант( все равно пишет s(((
кстати пробовала WinMenuSelectItem - не могу добиться чтобы работало хоть где-нибудь! хотя бы в том же самом вордпаде(((

spooll
14-08-2007, 12:07
Блин, протестил на нескольких компах, все ок. Добавил в автозагрузку 100 юзерям и у всех на разных окнах позависало просто, подскажите вариант более надежный :(
Opt("RunErrorsFatal", 0)

If FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe") Then Exit

BlockInput(1)

Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button1")

WinWait("Выбор варианта установки", "Выберите вариант установки программы", 20)
ControlClick("Выбор варианта установки", "Выберите вариант установки программы", "Button6")

WinWait("Информация о пользователе", "Введите Ваше имя и название", 20)
ControlClick("Информация о пользователе", "Введите Ваше имя и название", "Button2")

WinWait("Информация о пользователе", "Вы сообщили следующую информацию", 20)
ControlClick("Информация о пользователе", "Вы сообщили следующую информацию", "Button1")

WinWait("Выбор каталога для установки", "Программа установки поместит 1С", 20)
ControlClick("Выбор каталога для установки", "Программа установки поместит 1С", "Button1")

WinWait("Создание нового каталога", "", 20)
ControlClick("Создание нового каталога", "", "Button1")

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

WinWait("Установка 1С:Предприятия", "Программа установки скопировала файлы", 20)
ControlClick("Установка 1С:Предприятия", "Программа установки скопировала файлы", "Button2")

WinWait("Установка 1С:Предприятия", "Установка программы 1С", 20)
ControlClick("Установка 1С:Предприятия", "Установка программы 1С", "Button1")

Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button1")

WinWait("Список установленных программ", "Из списка найденных на данном компьютере", 20)
ControlClick("Список установленных программ", "Из списка найденных на данном компьютере", "Button4")

WinWait("Обновление 1С:Предприятия", "При работе с сетевыми версиями", 20)
ControlClick("Обновление 1С:Предприятия", "При работе с сетевыми версиями", "Button2")

WinWait("Обновление 1С:Предприятия", "Обновление программы 1С", 20)
ControlClick("Обновление 1С:Предприятия", "Обновление программы 1С", "Button1")
BlockInput(0)

Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
WinWaitActive("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", 25)
ControlClick ("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button1")

WinWait("PatchWise Updater", "ОК", 20)
ControlClick("PatchWise Updater", "ОК", "Button1")

WinWait("Патч 1С:Предприятие 7.7.025", "&Обновить", 20)
ControlClick("Патч 1С:Предприятие 7.7.025", "&Обновить", "Button2")
Run("\\192.168.11.198\distrib\1s_install\link.cmd")

Quit()

Func Quit()
Exit
EndFunc

Sanja Alone
14-08-2007, 18:26
SvetlanaK
и сохранить его в нужное место с нужным именем и закрыть- задача номер один
Не проблема, привожу решение данной задачи без лишних мышкодвижений:

$dFilePath = "D:\MyDoc\Результирующий_файл.xls" ; путь целевого файла

;константы, определяющие формат сохраняемого файла
const $xlCSV = 6 ; формат файла - coma separated values
const $xlTextMSDOS = 21 ; формат файла - текст MSDOS
const $xlWorkbookNormal = -4143 ; формат файла - xls

$oExcel = ObjGet("", "Excel.Application") ; "схватить" существующий объект Excel
If @error Then Exit ; выйти в случае неудачи

$oExcel.DisplayAlerts = 0 ; отключить предупреждения
$oExcel.ActiveWorkbook.SaveAs($dFilePath, $xlWorkbookNormal) ; сохранить файл как (здесь даже можно его сразу конвертировать во что-нибудь другое - некоторые константы описаны выше)
$oExcel.Quit ; выйти


непонятно , а каком месте оно применимо( ведь команда Save не предполагает опций - куда и с каким именем...Туда же и с тем же именем, т.е. в самого себя :) Так как условия задачи были сформулированы расплывчато, то я подумал, что ее суть в выполнении определенных действий над существующим файлом с последующим сохранением оного.

SvetlanaK
15-08-2007, 15:58
Sanja Alone, что-то не получилось...но вообще пример ваш интересен, пригодится в написании логов...
откуда только Вы это берете - не знаю, я весь хэлп перерыла, ничего подобного не нашла...видимо вы гений, или автор автоита:)
нашла я очень простое решение, публикую его. может кому-то пригодится.
Send("{Alt}{Ф}")
Send("{с}")
сочетание букв с альтом почему-то работает в отличие от контрола...
альт - ф активизация меню файл, а потом нажатие клавиши с и открывается окно сохранения.
а почему с контролом ни одна буква не работает - для меня большая загадка....
В общем - большое Вам спасибо за тепрение и внимание к моей проблеме.

Sanja Alone
15-08-2007, 16:32
SvetlanaK
что-то не получилось...Должно было получиться. Правда, может в момент запуска скрипта в Excel-е открыто больше одного файла, а тогда могло и не получиться... А еще могла отстутствовать на диске директория, куда нужно поместить результирующий файл. В данной ситуации лучше дописать в скрипт (до вызова метода SaveAs) такой фрагмент:

If Not FileExists(StringLeft($dFilePath, StringInStr($dFilePath, '\', 0, -1))) Then DirCreate(StringLeft($dFilePath, StringInStr($dFilePath, '\', 0, -1)))


откуда только Вы это беретеГуглю (http://www.google.ru/search?hl=ru&newwindow=1&q=Excel.Application)

сочетание букв с альтом почему-то работает в отличие от контрола...Так и должно быть - так работают все контролы (элементы управления), для которых определены хоткеи.
Узнать хоткей для любого контрола легко - это будет Alt+буква с подчеркиванием в тексте. Если "посмотреть" на этот контрол с пом. AutoIt Window Info, то перед этой буквой будет амперсанд:
;фрагмент информационного окна AutoIt Window Info:
Control ID: 1
ClassNameNN: Button2
Text: &Next >
альт - ф активизация меню файл, а потом нажатие клавиши с и открывается окно сохранения.Применительно к менюшкам так и есть - сначала Alt+хоткей менюшки, а затем просто хоткей пункта в этой менюшке.

Maza Faka
15-08-2007, 19:37
HotKeySet("{LWIN}", "MyFunc")
HotKeySet("{Esc}", "Quit")

While 1
Sleep(1000)
WEnd

Func MyFunc()
MsgBox(0, "", "You pressed Windows Key")
EndFunc

Func Quit()
Exit
EndFunc


Почему не работает, кто-нить может обьяснить?

Sanja Alone
15-08-2007, 21:11
Maza Faka
Почему не работаетНу, допустим {ESC} то работает. А {LWIN} попадает в список исключений (я выделил красным). Цитирую AutoIt.chm:
The following hotkeys cannot be set:

Ctrl+Alt+Delete - It is reserved by Windows
F12 - It is also reserved by Windows, according to its API.
NumPad's Enter Key - Instead, use {Enter} which captures both Enter keys on the keyboard.
Win+B,D,E,F,L,M,R,U; and Win+Shift+M - These are built-in Windows shortcuts. Note: Win+B and Win+L might only be reserved on Windows XP and above.
Alt, Ctrl, Shift, Win - These are the modifier keys themselves!
Other - Any global hotkeys a user has defined using third-party software,
any combos of two or more "base keys" such as '{F1}{F2}',
and any keys of the form '{LALT}' or '{ALTDOWN}'.

Angelus
16-08-2007, 11:22
Я извеняюсь........может этот подымался.......просто интересно.......при установке винды устанавливается руская раскладка клавиатуры по умолчанию(есть люди которые так ставят).....в автоскрипт вписана смена раскладки на ангиский, работает........но вместо ввода с клавиатуры допустим...C:\Alcohol Soft......вводится......\A Ї.....че за бред может быть??.....англиский язык тоже установлен....но не основным!......когда чтоит Англиский по умолчанию...то все отлично....

Maza Faka
16-08-2007, 18:42
Накарябал скрипт для поиска и удаления строк дубликатов, в принципе работает, но только если заменять строку дубликат любым символом, а вот просто удалить строку не заменяя её каким либо символом никак не получается, посоветуйте, как исправить?


#include <File.au3>
#include <Array.au3>
Dim $strArray, $file = "c:\test.txt"
_FileReadToArray($file ,$strArray)

For $i = 1 To $strArray[0]
$search = _ArraySearch($strArray, $strArray[$i])
If $search <> $i Then _FileWriteToLine($file, $i, " ", 1)
Next

Если заменять строку-дубликат вот так:

_FileWriteToLine($file, $i, "", 1)

то, после удаления первого дубликата, строки смещаются на одну строку вверх и соответственно удаляются строки не являющиеся дубликатами.

Maza Faka
16-08-2007, 19:13
Всё, разобрался. :)

#include <File.au3>
#include <Array.au3>
Dim $strArray, $file = "c:\test.txt"

Write($strArray)

Func Write($strArray)
_FileReadToArray($file ,$strArray)
For $i = 1 To $strArray[0]
$search = _ArraySearch($strArray, $strArray[$i])
If $search <> $i Then
_FileWriteToLine($file, $i, "", 1)
$strArray = 0
Write($strArray)
EndIf
Next
EndFunc

А, что скажут знатоки? Можно ли так обрабатывать текст?

Creat0R
17-08-2007, 09:49
Angelus

вместо ввода с клавиатуры допустим...C:\Alcohol Soft......вводится......\A Ї.....
Посылаются латинские символы при не латинской раскладке клавиатуры - с точки зрения AutoIT, нормальное пведение, хотя я сам хотел бы чтобы этого не происходило...
Как вариант менять раскладку перед посыланием символов, либо (намного надёжнее) писать текст используя ControlSetText(), ведь как я поняол нужно вписать текст в определёное поле другого приложения?

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

Я лично такой метод использую:


$File = "C:\test.txt"

$Ret = _FileDeleteDuplicates($File, -1)

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

Func _FileDeleteDuplicates($sFile, $sDirection=-1)
If Not FileExists($sFile) Then Return SetError(1, 0, -1)
Local $sFileArray = StringSplit(StringStripCR(FileRead($sFile)), @LF)
_ArrayDeleteClones($sFileArray, $sDirection)
Local $Extended = @extended
If $Extended = 0 Then Return SetError(0, 0, 0)
Local $hFile = FileOpen($sFile, 130), $LF = @LF
For $i = 1 To $sFileArray[0]
If $i = $sFileArray[0] Then $LF = ""
FileWrite($hFile, $sFileArray[$i] & $LF)
Next
FileClose($hFile)
Return SetError(0, $Extended, 1)
EndFunc

Func _ArrayDeleteClones(ByRef $sArray, $sDirection=-1)
If Not IsArray($sArray) Then Return SetError(1)
If UBound($sArray, 0) > 1 Then Return SetError(2)
Local $NewArr[1], $Extended=0, $FindDuplicate

For $i = 1 To UBound($sArray)-1
$FindDuplicate = _FindInArray($sArray, $sArray[$i], $i-1, $sDirection)
If $FindDuplicate = -1 Then
ReDim $NewArr[UBound($NewArr)+1]
$NewArr[UBound($NewArr)-1] = $sArray[$i]
Else
$Extended += 1
EndIf
Next

$NewArr[0] = UBound($NewArr) - 1
$sArray = $NewArr
Return SetError(0, $Extended, $sArray)
EndFunc

Func _FindInArray(ByRef $Array, $WhatToFind, $StartFrom=1, $sDirection=-1)
If UBound($Array) < 2 Then Return -1
Local $iFor = $StartFrom, $iTo = 1, $iStep = -1
If $sDirection = 1 Then
$iFor = $StartFrom + 2
$iTo = UBound($Array)-1
$iStep = 1
EndIf

For $iArr = $iFor To $iTo Step $iStep
If $Array[$iArr] = $WhatToFind Then Return $iArr
Next
Return -1
EndFunc

Maza Faka
17-08-2007, 17:59
Creat0R
Красиво, но для меня пока сложновато :(
Непонятно вот это SetError(1, 0, -1), зачем столько значений?

Creat0R
17-08-2007, 18:21
Maza Faka,
зачем столько значений?

Первое задаёт уровень ошибочности, второе нам не нужно в этом случае (расширенное значение содержащееся в макросе @extended на выходе с функции - если функция завершилась удачно, этот макрос будет содержать число произведённых замен в файле), но нужно третье, оно задаёт возвращаемое значение, подобно Return "Value"... таким образом можно проверить что функция завершилась неудачно (файл не найден), не всегда проверяется @error... хотя именно в этом случае, возможно и не нужно возвращать значение, но всё же так положенно :) (такое поведение наблюдается во многих встроенных функциях).

amel27
18-08-2007, 07:34
Maza Faka, Creat0R

еще два варианта удаления дублей: в 1-м случае файл подается в виде строки, во 2-м как массив строк#include <array.au3>

Func _TextStripDupLines($text)
If StringRight($text,2)<>@CRLF Then $text &= @CRLF
Do
$text = StringRegExpReplace($text,'(?s)(?m)(^[^\n]+\n)(.*?)(^\1)','\1\2')
Until @extended=0
Return $text
EndFunc

Func _ArrayDeleteClones($strArray)
Local $search, $newArray[1]=[0]
For $i = 1 To $strArray[0]
$search = -1
If $i<$strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
If $search=-1 Then
$newArray[0]+=1
ReDim $newArray[$newArray[0]+1]
$newArray[$newArray[0]]=$strArray[$i]
EndIf
Next
Return $newArray
EndFunc

Creat0R
18-08-2007, 07:56
amel27,
в 1-м случае файл подается в виде строки
Не перестаю удивляться мощности этого инструмента (Регулярных выражении), ну и конечно твоему умению его использовать ;)
Правда этот метод расчитан только если попадаются как разделители строк @CRLF, а как быть с теми случаями когда строки поделены только лишь @LF/@CR? пробовал похимичить с Pattern, ничего не вышло :( .

Maza Faka
18-08-2007, 11:17
amel27
Немного исправил твой код:

#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)

Func _ArrayDeleteClones($strArray, $newArray)
Dim $search, $newArray[1]=[0]
For $i = 1 To $strArray[0]
$search = $i
If $i <= $strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
If $search = -1 Then
$newArray[0] += 1
ReDim $newArray[$newArray[0]+1]
$newArray[$newArray[0]]=$strArray[$i]
EndIf
Next
_ArrayDisplay($newArray, "Result")
EndFunc

а то последняя строка игнорировалась.

amel27
18-08-2007, 12:17
последняя строка игнорироваласьты прав - была ошибка, но так ее править нельзя, так как поиск ведется со следующего элемента... ошибка была строчкой выше. ;)
как быть с теми случаями когда строки поделены только лишь @LF/@CR?RegExp распознает начало/конец строки только на основании @LF, а вот @CR является "лишним балластом" и без него можно обойтись... хотя без @CR из-за "+" пустые строки будут игнорироваться ("*" ставить нельзя!) Как вариант - использовать StringAddCR() и StringStripCR().

З.Ы. На самом деле AutoIT поддерживает не все возможности регулярных выражений, поэтому приходится выкручиваться.

Maza Faka
18-08-2007, 13:26
amel27
В итоге сделал так:

#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)
_ArrayDisplay($newArray, "Result")

Func _ArrayDeleteClones($strArray, ByRef $newArray)
Dim $search, $newArray[1]=[0]
For $i = 1 To $strArray[0]
$search = _ArraySearch($strArray, $strArray[$i], $i+1)
If $search = -1 Then
$newArray[0] += 1
ReDim $newArray[$newArray[0]+1]
$newArray[$newArray[0]]=$strArray[$i]
EndIf
Next
EndFunc

сойдёт или нет?

amel27
18-08-2007, 14:22
Maza Faka

я тут подумал насчет твоего варианта - почему он работает хотя вроде не должен... ведь действительно, если использовать встроенную защиту _ArraySearch() код можно еще сократить :)#include <array.au3>
#include <file.au3>

Dim $a, $f = 'c:\test.txt'
_FileReadToArray($f, $a)
_FileWriteFromArray($f,_ArrayDeleteClones($a),1)

Func _ArrayDeleteClones($strArray)
Local $newArray[1]=[0]
For $i = 1 To $strArray[0]
If _ArraySearch($strArray, $strArray[$i], $i+1)<0 Then
$newArray[0]+=1
ReDim $newArray[$newArray[0]+1]
$newArray[$newArray[0]]=$strArray[$i]
EndIf
Next
Return $newArray
EndFunc

Maza Faka
18-08-2007, 19:21
amel27
почему он работает хотя вроде не должен
:)




© OSzone.net 2001-2012