Скриптинг на AUTOIT
|
|
asmadeus | Дата: Понедельник, 16.12.2013, 16:44 | Сообщение № 1 |
|
Скриптинг на AUTOIT
Тема для вопросов и ответов по написанию скриптов на autoit'e - стремительно набирающем популярность языке автоматизации выполнения рутинных дел при работе на компьютере.
Сообщение отредактировал asmadeus - Суббота, 01.02.2014, 23:01 |
|
| |
Паразит | Дата: Четверг, 29.12.2016, 00:58 | Сообщение № 61 |
Майор
На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
|
Привет. Чё-то у меня не получается установить правильный разделитель. Задача. В буфере у меня полные пути до файлов, я запускаю скрипт, и они все выполняются с помощью функции ShellExecute. На моей ХР запускаются лишние процессы. Другие говорят, что у них всё нормально запускается. У меня неправильно интерпретируются разделитель. Обычно в два раза больше. Запускаются, то блокнот, то проводник. В зависимости от флагов.
Код $Clp = StringSplit(ClipGet(), @CRLF, 0) For $i in $Clp Call("Test") Next
Func Test() ShellExecute($i, "", "", "") EndFunc
Если стоит @LF, то первые файлы по списку найти не может, а запускается только последний. А может быть мне вообще, не надо использовать разделитель?
Код $Clp = ClipGet() For $i in $Clp ShellExecute($Clp[$i], "", "") Next
Сообщение отредактировал Паразит - Четверг, 29.12.2016, 01:07 |
|
| |
Andrey_A | Дата: Четверг, 29.12.2016, 01:20 | Сообщение № 62 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата Паразит ( ) У меня неправильно интерпретируются разделитель. Какой вы задаёте разделитель, такой и на выходе результат, если вы хотите подобрать разделитель, то делайте отдельную функцию, которая проверяла бы @LF, @CR, @CRLF --- Вариантов можно придумать много:
Можно разбить к примеру, так (не вычисляя разделитель и отбрасывая пустые строки ):
Код #include <Array.au3> $aClip=StringRegExp(ClipGet(),"(?m)^([^\r\n]?.+)",3) _ArrayDisplay($aClip,"Массив $aClip") For $i in $aClip ShellExecute($i) Next
Можно поставить условие на проверку существования файла...
Код $aClip=StringRegExp(ClipGet(),"(?m)^([^\r\n]?.+)",3) For $i in $aClip If FileExists($i)Then ShellExecute($i) Next
.
|
|
| |
Паразит | Дата: Пятница, 30.12.2016, 05:15 | Сообщение № 63 |
Майор
На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
|
Andrey_A, спасибо, работают оба варианта
--------------------------------------------- Андрей, а как мне проверять на наличие файлов в каталоге назначения, и в случае их присутствия, добавлять к копируемым именам файлов счётчик? В параметре %P%S.
Код $sDest = FileSelectFolder('Select Folder', '', 7) For $i=1 To $CmdLine[0] If FileExists($sDest & $CmdLine[$i]) Then FileCopy($CmdLine[$i] + 'sss', $sDest) Else FileCopy($CmdLine[$i] & '111', $sDest) EndIf Next
Сообщение отредактировал Паразит - Пятница, 30.12.2016, 05:43 |
|
| |
Andrey_A | Дата: Пятница, 30.12.2016, 11:15 | Сообщение № 64 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
Цитата Паразит ( ) а как мне проверять на наличие файлов в каталоге назначения, и в случае их присутствия, добавлять к копируемым именам файлов счётчик? В параметре %P%S.
1. Разбивать путь файла на составные: путь, имя, расширение 2. Добавлять к пути назначения имя и расширение 3. Проверять, если есть существование, то добавляйте счётчик (он может быть различный - придумай сам какой нужен) ---- И вообще полезно с помощью функций _ArrayDisplay() и MsgBox() проверять содержимое переменных
Код #Include <FileOperations.au3> #include <Array.au3> _ArrayDisplay($CmdLine,"Массив $CmdLine") ; $sDest = FileSelectFolder('Select Folder', '', 7) $sDest='c:\' For $i=1 To $CmdLine[0] $aPath=_FO_PathSplit($CmdLine[$i]) _ArrayDisplay($aPath,"Массив $aPath") $sPath=$sDest&$aPath[1]&$aPath[2] MsgBox(4096,"Переменная $sPath","$sPath =>"&$sPath&"<=") If FileExists($sPath)Then $sPath=$sDest&$aPath[1]&'_счётчик'&$aPath[2] MsgBox(4096,"Переменная $sPath","$sPath =>"&$sPath&"<=") FileCopy($CmdLine[$i],$sPath) Next
Когда все проверено, то можно убрать лишние функции
Код #Include <FileOperations.au3> $sDest=FileSelectFolder('Select Folder','',7) For $i=1 To $CmdLine[0] $aPath=_FO_PathSplit($CmdLine[$i]) $sPath=$sDest&$aPath[1]&$aPath[2] If FileExists($sPath)Then $sPath=$sDest&$aPath[1]&'_счётчик'&$aPath[2] FileCopy($CmdLine[$i],$sPath) Next
.
|
|
| |
Паразит | Дата: Пятница, 30.12.2016, 12:03 | Сообщение № 65 |
Майор
На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
|
Вообще-то предпологалось, что к имени будет добавляться цифровой счётчик.
В смысле Name-1.ext, Name-2.ext и т.д.
Я так думаю, что надо создавать промежуточную функцию, которая будет возвращать математическое действие.
И ещё, он копирует в текущюю панель. Если же поменять
Код FileCopy($CmdLine[$i],$sPath) на
Код FileCopy($CmdLine[$i],$sDest) То первый раз копируется нормально, а во второй раз вообще ничего не происходит.
|
|
| |
Andrey_A | Дата: Пятница, 30.12.2016, 12:27 | Сообщение № 66 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
Паразит, я дал лишь пример - сам проверяй, смотри как тебе надо - функцию создавай, вот частичный пример:
Код Func _NewName($ps) While FileExists($ps) $ps=путь&имя&счётчик&расширение WEnd Return $ps EndFunc
|
|
| |
Паразит | Дата: Пятница, 27.01.2017, 01:50 | Сообщение № 67 |
Майор
На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
|
Андрей, а как вызвать пользовательскую команду?
Код Local $hUser32Dll=DllOpen("user32.dll"),$TC_HWND=WinGetHandle('[CLASS:TTOTAL_CMD]') TCCM(em_CDTemp)
Func TCCM($nTCMsg) Return DllCall($hUser32Dll,"int","PostMessage","hwnd",$TC_HWND,"int",1075,"wparam",$nTCMsg,"lparam",0) EndFunc
|
|
| |
Andrey_A | Дата: Пятница, 27.01.2017, 15:52 | Сообщение № 68 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
Паразит,
Код Global $hUser32Dll=DllOpen("user32.dll"),$TC_HWND=WinGetHandle('[CLASS:TTOTAL_CMD]')
_TCEM('em_CDTemp')
Func _TCEM($fCommand) Local $pCommand=DllStructCreate("char["&StringLen($fCommand)&"]"),$fData=DllStructCreate("ulong_ptr;dword;ptr"),$0=DllStructSetData($pCommand,1,$fCommand)&DllStructSetData($fData,1,19781)&DllStructSetData($fData,2,DllStructGetSize($pCommand))&DllStructSetData($fData,3,DllStructGetPtr($pCommand))&DllCall($hUser32Dll,"int","SendMessage","hwnd",$TC_HWND,"int",74,"wparam",_TCHGetScriptProcHandle(),"lparam",DllStructGetPtr($fData)) EndFunc
Func _TCHGetScriptProcHandle() $sTitle="ScriptWinRandomTitle" For $o=0 To 31 $sTitle&=Chr(Random(65,90)) Next AutoItWinSetTitle($sTitle) Return WinGetHandle($sTitle) EndFunc
|
|
| |
Паразит | Дата: Вторник, 07.02.2017, 07:10 | Сообщение № 69 |
Майор
На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
|
Андрюша, спасибо. Наверное, никто в мире не написал бы такой скрипт. Добавлено (07.02.2017, 07:10) --------------------------------------------- Андрей, почему у меня не получается добавить счётчик к именам, если папки существуют?
Код $sClp = ClipGet() ;$bbb = StringRegExpReplace($sClp, '(.*)\\', '$1') ; $aaa = StringSplit($bbb, '') ; MsgBox(0, "Msg", $bbb)
$aDirs = StringSplit($sClp, @LF) For $i = 1 To $aDirs[0] ; MsgBox(0, "Msg", $b) If FileExists($aDirs[$i]) Then Do $iC += 1 Until Not FileExists($aDirs[$i] & '-' & $iC) DirCreate($aDirs[$i] & '-' & $iC) $iC = 0 Else DirCreate($aDirs[$i]) EndIf Next
|
|
| |
asmadeus | Дата: Четверг, 25.01.2018, 19:58 | Сообщение № 70 |
|
Привет. Спрашивал на форуме autoit, но там пока молчат. Как в listview выделить строку так, как в windows? Конкретно интересует обработка параметра тем тотала (курсор в стиле windows). То есть как строке назначить вот тот полупрозрачный синий прямоугольник. В справке накопал только _winapi_getsyscolors - получение системных цветов, но там все без прозрачности. Как получить именно системный курсор (выделение)?
|
|
| |
Andrey_A | Дата: Пятница, 02.02.2018, 16:20 | Сообщение № 71 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
asmadeus, если ещё актуально, то так:
Код #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiImageList.au3> #include <WindowsConstants.au3>
Global $hListView,$IC_WINVER=_IC_WinVer()
_Main()
Func _Main()
Local $GUI, $hImage $GUI = GUICreate("Создание ListView", 400, 300)
$hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268) _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)) _IC_SetExplorerStyle($hListView) GUISetState()
; Загружает изображения $hImage = _GUIImageList_Create() _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16)) _GUICtrlListView_SetImageList($hListView, $hImage, 1)
; Добавляет колонки _GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1", 100) _GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2", 100) _GUICtrlListView_InsertColumn($hListView, 2, "Колонка 3", 100)
; Добавляет пункты _GUICtrlListView_AddItem($hListView, "Стр 1: Кол 1", 0) _GUICtrlListView_AddSubItem($hListView, 0, "Стр 1: Кол 2", 1) _GUICtrlListView_AddSubItem($hListView, 0, "Стр 1: Кол 3", 2) _GUICtrlListView_AddItem($hListView, "Стр 2: Кол 1", 1) _GUICtrlListView_AddSubItem($hListView, 1, "Стр 2: Кол 2", 1) _GUICtrlListView_AddItem($hListView, "Стр 3: Кол 1", 2)
; Цикл выполняется, пока окно не будет закрыто Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>_Main
Func _IC_SetExplorerStyle($hWnd) $hWnd=IsHWnd($hWnd)? $hWnd : GUICtrlGetHandle($hWnd) If $hWnd And $IC_WINVER>=1536 Then $aRet=DllCall('uxtheme.dll','uint','SetWindowTheme',"hwnd",$hWnd,'wstr','Explorer','ptr',0) If Not @error And Not $aRet[0]Then Return 1 EndIf Return EndFunc
Func _IC_WinVer() Local $fLine=DllStructCreate('dword OSVersionInfoSize;dword MajorVersion;dword MinorVersion;dword BuildNumber;dword PlatformId;wchar CSDVersion[128]'),$0=DllStructSetData($fLine,'OSVersionInfoSize',DllStructGetSize($fLine)),$Ret=DllCall('kernel32.dll','int','GetVersionExW','ptr',DllStructGetPtr($fLine)) Return(Not @error And $Ret[0])? BitOR(BitShift(DllStructGetData($fLine,'MajorVersion'),-8),DllStructGetData($fLine,'MinorVersion')):0 EndFunc
|
|
| |
asmadeus | Дата: Суббота, 03.02.2018, 20:40 | Сообщение № 72 |
|
Andrey_A, актуально, беру на вооружение, после внедрения отпишусь о результате
|
|
| |
asmadeus | Дата: Воскресенье, 11.02.2018, 14:00 | Сообщение № 73 |
|
Привет, может кто направит на путь поиска решения. Исходная ситуация - комп один, тотал один, автоит один. Скрипта два. Один тестовый
Код $1111 = EnvGet ('COMMANDER_PATH') MsgBox(4096,"Переменная $1111","Файл test_Env.au3 ~~ Строка 1"&@CRLF&"$1111 =>"&$1111&"<=") Второй нужный (код больно здоровый) Суть в том, что во втором скрипте функция EnvGet ('COMMANDER_PATH') не выдает ничего. Как можно отловить проблему?
|
|
| |
Andrey_A | Дата: Воскресенье, 11.02.2018, 14:31 | Сообщение № 74 |
Генералиссимус
На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7191
Награды: 143
Репутация: 125
Аверин Андрей
|
asmadeus, я такого не замечал.. Было как-то: если AkelPad запустить не из тотала и раньше него, то скрипты и кнопки могут не подхватывать переменную %COMMANDER_PATH% А в основном все нормально - создал 2 срипта и запускал из разных мест: акела, раб. стола, тотала - все определяется... -------------------- Что касается вопроса в Л.С., то там синтаксис хромает:
Код Run(@ScriptDir&'\TCIMG.exe infbx=InfoBox_TEST1')
или лучше так:
Код Run('"'&@ScriptDir&'\TCIMG.exe" "infbx=InfoBox_TEST1"')
Если через утилиту, то так:
Код exect=Run(@ScriptDir&'\TCIMG.exe~~infbx=InfoBox_TEST1')
.
|
|
| |
asmadeus | Дата: Воскресенье, 11.02.2018, 18:41 | Сообщение № 75 |
|
Andrey_A, в скрипте оказалась виновата строка
Закомментировал - и стала определятся переменная среда нормально. С запуском команд разобрался, но без переменной среды не работало. Но при этом возникает другой косяк. Получается, одной форме скрипта нужен
а другой напротив, не нужен - там при правах админа не работает строка вида
Код ShellExecuteWait(@ScriptDir&'\TCIMG.exe', 'tcimg=$am'&$aVb[$i], '', '', @SW_HIDE) Как можно поступить, можно ли указать, какой форме давать админа или нет? Или использовать вместо ShellExecuteWait функцию RunAsWait? Хотя тоже не пойму...
Сообщение отредактировал asmadeus - Воскресенье, 11.03.2018, 12:11 |
|
| |
|