Автор Тема: Получить свойства объекта  (Прочитано 15629 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн eas0371 [?]

  • Новичок
  • *
  • Сообщений: 5
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Получить свойства объекта
« Создано: Ноябрь 21, 2014, 19:47:22 »
Как в autoit вывести все свойства объекта?
К примеру есть объект:
$oExcel = _ExcelBookNew(0)
К конкретному свойству можно обратиться указывая его через точку:
$oExcel.Range('A2:A5').Select

А как вывести список всех свойств которые можно указать через точку в данном объекте, ведь должно же быть что-то наподобие PropertyList ??

Русское сообщество AutoIt

Получить свойства объекта
« Отправлен: Ноябрь 21, 2014, 19:47:22 »

Оффлайн alex33 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1359
  • Репутация: 171
  • Пол: Мужской
    • alekssamos ВКонтакте
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #1, Отправлен: Ноябрь 21, 2014, 20:01:40 »
Это цикл
Код: AutoIt [Выделить]
For...In...Next


Оффлайн eas0371 [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #2, Отправлен: Ноябрь 21, 2014, 20:22:14 »
цикл не прокатывает, с помощью него можно перебрать все подобъекты, а если свойство не является объектом?
например, имеем класс:
$objClass = ObjGet("WinMgmts:Win32_DiskDrive")
получаем коллекцию объектов
$colSoftware = $objClass.Instances_
и перебираем все диски установленные на компе
For $objSoftware in $colSoftware
$strResult = $strResult & '  ' &  $objSoftware.caption
next
В свойстве Caption содержится название диска.
Но у данного объекта помимо Caption еще много других свойств, тоже строковых - как получить их названия?

Оффлайн Viktor1703 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1512
  • Репутация: 405
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #3, Отправлен: Ноябрь 21, 2014, 21:47:59 »
Вообще списка свойств и методов не существует в объекте, если разработчик заранее не позаботился об этом, чаще всего узнать какие методы и свойства есть у данного объекта можно через тот же Google просто задав правильный запрос, например WinMgmts Methods, результат *click*

Русское сообщество AutoIt

Re: Получить свойства объекта
« Ответ #3 Отправлен: Ноябрь 21, 2014, 21:47:59 »

Оффлайн eas0371 [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #4, Отправлен: Ноябрь 21, 2014, 23:04:43 »
ну а хотя бы как-то обработать ошибку можно в случае если данного свойства у объекта нет?
например тот же wmi отличается по набору свойств в разных виндах

Оффлайн Viktor1703 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1512
  • Репутация: 405
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #5, Отправлен: Ноябрь 21, 2014, 23:10:49 »
eas0371  [?]
Цитировать
ну а хотя бы как-то обработать ошибку можно в случае если данного свойства у объекта нет? например тот же wmi отличается по набору свойств в разных виндах

В таком случае в скрипте сделать условие

Код: AutoIt [Выделить]
Switch @OSVersion
    Case 'WIN_8'
        $oObj.Method_1(...)
    Case 'WIN_7'
        $oObj.Method_2(...)
    Case 'WIN_XP'
        $oObj.Method_3(...)
    Case Else
        $oObj.Method_0(...)
EndSwitch  
 


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Получить свойства объекта
« Ответ #6, Отправлен: Ноябрь 22, 2014, 00:16:23 »
eas0371,
ПредупреждениеЗа нарушение правил форума (пункт В.11):
Цитировать
Любые отрывки AutoIt кода необходимо заключать в тег [autoit] (подробнее), а обычный код соответственно в тег [code] (подробнее). Также большие выдержки текста помещайте под тег [spoiler] (подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #7, Отправлен: Ноябрь 22, 2014, 10:33:18 »

Русское сообщество AutoIt

Re: Получить свойства объекта
« Ответ #7 Отправлен: Ноябрь 22, 2014, 10:33:18 »

Оффлайн eas0371 [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #8, Отправлен: Ноябрь 23, 2014, 23:13:50 »
всем спасибо

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Получить свойства объекта
« Ответ #9, Отправлен: Февраль 09, 2015, 15:23:47 »
Код: AutoIt [Выделить]
#include <Array.au3>

#AutoIt3Wrapper_UseX64=n

Global Const $cINVOKE_ALL               = -1 ; All methods/properties
Global Const $cINVOKE_FUNC              = 1 ; A method (=function)
Global Const $cINVOKE_PROPERTYGET       = 2 ; Read-only property
Global Const $cINVOKE_PROPERTYPUT       = 4 ; Read/write property
Global Const $cINVOKE_PROPERTYPUTREF    = 8 ; Reference property

$sObj = InputBox('_ObjGetMembers', 'Enter object name:', 'Scripting.FileSystemObject')
If StringStripWS($sObj, 8) == '' Then Exit

$oObj = ObjCreate($sObj)
$aObj_Members = _ObjGetMembers($sObj, 1, $cINVOKE_ALL)

If IsArray($aObj_Members) Then
    _ArrayDisplay($aObj_Members)
   
    If UBound($aObj_Members) > 16 Then
        ;16 should be .GetTempName
        ConsoleWrite('$oObj.' & $aObj_Members[16] & ' = ' & Execute("$oObj." & $aObj_Members[16]) & @CRLF)
    EndIf
EndIf

ConsoleWrite("_ObjMemberIsValid($sObj, 'NonExsistingMember'): " & _ObjMemberIsValid($sObj, 'NonExsistingMember') & @LF)

Func _ObjGetMembers($sObj, $iRetType = 1, $iInvokeKind = $cINVOKE_ALL)
    Local $sCode = ''
   
    $sCode &= 'Function ObjGetMembers(sObj)' & @CRLF
    $sCode &= ' Set oObj = CreateObject(sObj)' & @CRLF
    $sCode &= ' Set oTLA = CreateObject("TLI.TLIApplication")' & @CRLF
    $sCode &= ' Set oMembers = oTLA.InterfaceInfoFromObject(oObj).Members' & @CRLF
    $sCode &= ' sMembers = ""' & @CRLF
    $sCode &= ' For Each oMember In oMembers' & @CRLF
    $sCode &= '     If ' & $iInvokeKind & ' = ' & $cINVOKE_ALL & ' Or oMember.InvokeKind = ' & $iInvokeKind & ' Then' & @CRLF
    $sCode &= '         sMembers = sMembers & oMember.Name & vbCRLF' & @CRLF
    $sCode &= '     End If' & @CRLF
    $sCode &= ' Next' & @CRLF
    $sCode &= ' ObjGetMembers = sMembers' & @CRLF
    $sCode &= 'End Function' & @CRLF
   
    Local $VbsObj = ObjCreate('ScriptControl')
    If @error Then Return SetError(1, 0, -1)
   
    $VbsObj.Language = 'vbscript'
    $VbsObj.AddCode($sCode)
   
    Local $sRet = StringStripWS($VbsObj.Run('ObjGetMembers', $sObj), 3)
    If Not $sRet Then Return SetError(2, 0, 0)
   
    If $iRetType = 1 Then
        Return StringSplit($sRet, @CRLF, 1)
    EndIf
   
    Return $sRet
EndFunc

Func _ObjMemberIsValid($sObj, $vMember)
    Local $aObj_Members = _ObjGetMembers($sObj)
   
    For $i = 1 To UBound($aObj_Members)-1
        If $aObj_Members[$i] = $vMember Then
            Return 1
        EndIf
    Next
   
    Return 0
EndFunc


Неизвестно почему, но работает только через запуск vbs кода, на AutoIt почему то не создаётся объект TLI.TLIApplication.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3945
  • Репутация: 958
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Получить свойства объекта
« Ответ #10, Отправлен: Февраль 09, 2015, 15:29:52 »
Цитировать
как получить весь список?
AutoCAD

Скорблю и помню.




Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получить свойства объекта
« Ответ #11, Отправлен: Февраль 09, 2015, 15:50:50 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Получить свойства объекта
« Ответ #12, Отправлен: Февраль 09, 2015, 18:36:41 »
inververs  [?]
Цитировать
Или вотспособ через powershell
Супер, вот что наваял из этого:

Код: AutoIt [Выделить]
#include <Array.au3>

$aMembers = _ObjGetMembersPS('Shell.Explorer.2')
_ArrayDisplay($aMembers)

Func _ObjGetMembersPS($sObj)
    Local $iPid, $sRead, $aRead, $iUbnd, $aRet[1][3] = [[0]]
   
    $iPid = Run('powershell.exe -Command $SW = New-object -ComObject "' & $sObj & '";$SW|Get-Member', "", @SW_HIDE, 0x2 + 0x4)
    ProcessWaitClose("powershell.exe")
   
    $sRead = StdoutRead($iPid)
    $aRead = StringRegExp($sRead, '(?smi)\G(?:\s*(\w+)\h+(\w+)\h+([^\r\n]+))\R*|.*?\s*(.*?)\s*Name\h+MemberType\h+Definition\s*[-\h]+\R*\K', 3)
    $iUbnd = UBound($aRead)
   
    For $i = 1 To $iUbnd - 1 Step 3
        $aRet[0][0] += 1
        ReDim $aRet[$aRet[0][0] + 1][3]
       
        $aRet[$aRet[0][0]][0] = $aRead[$i]
       
        If $i + 1 < $iUbnd Then
            $aRet[$aRet[0][0]][1] = $aRead[$i + 1]
        EndIf
       
        If $i + 2 < $iUbnd Then
            $aRet[$aRet[0][0]][2] = $aRead[$i + 2]
        EndIf
    Next
   
    If $iUbnd > 2 Then
        $aRet[0][1] = $aRead[3]
        $aRet[1][0] = 'Name'
        $aRet[1][1] = 'MemberType'
        $aRet[1][2] = 'Definition'
    EndIf
   
    Return $aRet
EndFunc

« Последнее редактирование: Февраль 10, 2015, 01:20:47 от CreatoR »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Получить свойства объекта
« Ответ #13, Отправлен: Февраль 09, 2015, 18:43:09 »
CreatoR,
Ну очень полезная функция получилась, однозначно в полезняшки.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3548
  • Репутация: 934
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Получить свойства объекта
« Ответ #14, Отправлен: Февраль 09, 2015, 19:31:40 »
CreatoR  [?]
Цитировать
вот что наваял из этого
Для объектов Excel.Application и Word.Application массив пустой :(

Русское сообщество AutoIt

Re: Получить свойства объекта
« Ответ #14 Отправлен: Февраль 09, 2015, 19:31:40 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
5139 Просмотров
Последний ответ Август 02, 2010, 23:10:32
от WSWR
6 Ответов
4182 Просмотров
Последний ответ Март 29, 2011, 18:48:24
от gregaz
1 Ответов
2128 Просмотров
Последний ответ Март 13, 2012, 17:06:10
от Pavel
9 Ответов
4710 Просмотров
Последний ответ Август 06, 2012, 11:17:23
от madmasles
1 Ответов
1208 Просмотров
Последний ответ Март 11, 2014, 16:06:53
от InnI
0 Ответов
523 Просмотров
Последний ответ Май 30, 2015, 19:20:44
от k790
16 Ответов
3760 Просмотров
Последний ответ Июнь 22, 2015, 18:53:07
от Gen345
1 Ответов
2955 Просмотров
Последний ответ Июнь 22, 2015, 13:17:44
от madmasles
16 Ответов
4646 Просмотров
Последний ответ Июль 31, 2015, 11:12:20
от DruKot
3 Ответов
608 Просмотров
Последний ответ Июль 20, 2017, 20:00:25
от Alofa