[ Обновленные темы · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 5 из 6
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Модератор форума: Andrey_A, ХарВик, chip642  
Форум » • Общение Пользователей • » Секреты мастерства » Скриптинг на AUTOIT (Учимся писать скрипты на Autoit и делимся опытом)
Скриптинг на AUTOIT
asmadeusДата: Понедельник, 16.12.2013, 16:44 | Сообщение № 1
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Скриптинг на AUTOIT




Тема для вопросов и ответов по написанию скриптов на autoit'e - стремительно набирающем популярность языке автоматизации выполнения рутинных дел при работе на компьютере.


Сообщение отредактировал asmadeus - Суббота, 01.02.2014, 23:01
 
ПаразитДата: Четверг, 29.12.2016, 00:58 | Сообщение № 61
Майор

На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
Награды: 0
Репутация: 0
Привет. Чё-то у меня не получается установить правильный разделитель.
Задача. В буфере у меня полные пути до файлов, я запускаю скрипт, и они все выполняются с помощью функции 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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Награды: 0
Репутация: 0
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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Награды: 0
Репутация: 0
Вообще-то предпологалось, что к имени будет добавляться цифровой счётчик.

В смысле 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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 125
Аверин Андрей
Паразит, я дал лишь пример - сам проверяй, смотри как тебе надо - функцию создавай, вот частичный пример:
Код

Func _NewName($ps)
  While FileExists($ps)
      $ps=путь&имя&счётчик&расширение
  WEnd
  Return $ps
EndFunc


 
ПаразитДата: Пятница, 27.01.2017, 01:50 | Сообщение № 67
Майор

На сайте с: 27.02.2016
Город: Быково
Сообщений: 86
Награды: 0
Репутация: 0
Андрей, а как вызвать пользовательскую команду?

Код

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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Награды: 0
Репутация: 0
Андрюша, спасибо. Наверное, никто в мире не написал бы такой скрипт.

Добавлено (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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Привет. Спрашивал на форуме autoit, но там пока молчат.
Как в listview выделить строку так, как в windows? Конкретно интересует обработка параметра тем тотала (курсор в стиле windows).
То есть как строке назначить вот тот полупрозрачный синий прямоугольник.
В справке накопал только _winapi_getsyscolors - получение системных цветов, но там все без прозрачности. Как получить именно системный курсор (выделение)?
 
Andrey_AДата: Пятница, 02.02.2018, 16:20 | Сообщение № 71
Генералиссимус

На сайте с: 26.01.2012
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Andrey_A, актуально, беру на вооружение, после внедрения отпишусь о результате
 
asmadeusДата: Воскресенье, 11.02.2018, 14:00 | Сообщение № 73
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Привет, может кто направит на путь поиска решения.
Исходная ситуация - комп один, тотал один, автоит один. Скрипта два.
Один тестовый
Код
$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
Город: Сочи, Хоста
Сообщений: 7167
Награды: 139
Репутация: 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
Генералиссимус

На сайте с: 14.12.2012
Город: Кривой Рог
Сообщений: 1375
Награды: 29
Репутация: 32
Andrey_A, в скрипте оказалась виновата строка
Код
#RequireAdmin

Закомментировал - и стала определятся переменная среда нормально.
С запуском команд разобрался, но без переменной среды не работало.
Но при этом возникает другой косяк. Получается, одной форме скрипта нужен
Код
#RequireAdmin

а другой напротив, не нужен - там при правах админа не работает строка вида
Код
ShellExecuteWait(@ScriptDir&'\TCIMG.exe', 'tcimg=$am'&$aVb[$i], '', '', @SW_HIDE)

Как можно поступить, можно ли указать, какой форме давать админа или нет? Или использовать вместо ShellExecuteWait функцию RunAsWait? Хотя тоже не пойму...


Сообщение отредактировал asmadeus - Воскресенье, 11.03.2018, 12:11
 
Форум » • Общение Пользователей • » Секреты мастерства » Скриптинг на AUTOIT (Учимся писать скрипты на Autoit и делимся опытом)
  • Страница 5 из 6
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Поиск:

Интеллектуальные права и отказ от ответственности