<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Как посмотреть все свойства объекта?]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5191</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5191&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Как посмотреть все свойства объекта?».]]></description>
		<lastBuildDate>Thu, 02 Dec 2010 18:14:32 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=42427#p42427</link>
			<description><![CDATA[<div class="codebox"><pre><code>class MyObj
  dim p1, p2, p3
  property let prop1(value)
    p1 = value
  end property
  property get prop1
    prop1 = p1
  end property
end class

dim obj
set obj = new MyObj
obj.p1 = &quot;123&quot;
obj.p2 = 2
set ms=createobject(&quot;msscriptcontrol.scriptcontrol&quot;)
ms.language=&quot;javascript&quot;
ms.eval(&quot;Enum=function(x){this.x=new Array();for (i in x) {this.x[i]=i};return this.x}&quot;)
set this=ms.eval(&quot;this&quot;)
for each c in this.Enum(obj)
    msgbox c &amp; &quot;=&quot; &amp; eval(&quot;obj.&quot; &amp; c)
next</code></pre></div><p>или еже более обВасиковить<br /></p><div class="codebox"><pre><code>set this=ms.eval(&quot;this&quot;)
set Enums=this.Function(&quot;x&quot;,&quot;y=Array();for (i in x) {y[i]=i};return y&quot;)
for each c in Enums(obj)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Thu, 02 Dec 2010 18:14:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=42427#p42427</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=42424#p42424</link>
			<description><![CDATA[<p>... а я таки завершил дело.</p><p>Теперь <em>это</em> умеет ковырять массивы, регэкспы, классы (с помощью js-кода), Dictionary.<br /></p><div class="codebox"><pre><code>&#039;Возвращает строку рекурсивного описания содержимого объекта oBj. Полная версия
private function vardump (byref oBj, byval sParentName, byval nEsting)
  const nEsting_max = 20  &#039;Максимальный уровень вложенности
  const nPaddingSpace = 2 &#039;Структурный отступ (на него сдвигаем потомков отн. родителей), число пробелов
  const sUnknownValue = &quot;(?)&quot;
  if VarType(sParentName) &lt;&gt; 8 then &#039;Антиглюк: Если не строка
    on error resume next
    sParentName = CStr(sParentName)
    if Err.Number then &#039;Антиглюк: При неудачном преобразовании сбрасываем
      sParentName = &quot;&quot;
    end if
    on error goto 0
  end if
  if not IsNumeric(nEsting) then &#039;Проверка nEsting
    nEsting = nEsting_max
  end if
  dim sNoSpace4First, sRes

  if sParentName = &quot;&quot; then &#039;У безымянного объекта не будет пробела перед типом
    sNoSpace4First = &quot;&quot;
  else
    sNoSpace4First = &quot; &quot;
  end if
  if nEsting &gt;= 0 then
    dim sObj, i, nArrDims, nElCount, oDi, oJRes, oEl
    nArrDims = -1
    oJRes = false &#039;Является ли object составным по мнению JScript
    set oDi = CreateObject(&quot;Scripting.Dictionary&quot;)
    
    if IsObject(oBj) then &#039;Показать сущность
      sObj = &quot;(object)&quot;
      if VarType(oBj) = 8 then
        dim sTmp
        &#039; on error resume next
        sTmp = &quot;&#039;&quot; &amp; CStr(oBj) &amp; &quot;&#039;&quot;
        if not Err then
          sObj = sObj &amp; sTmp
        end if
        &#039; on error goto 0
      end if
      
      dim oSC, sJsCode
      set oSC = CreateObject(&quot;ScriptControl&quot;)
      oSC.Language = &quot;JScript&quot;
      sJsCode = &quot;function GetObjectProps(oBj, oA){ var sRes=false; if (typeof(oBj)==&#039;object&#039;) for (var oEl in oBj) &quot; &amp; _
        &quot;{try {oA.Add(oEl, oBj[oEl]);} catch(e) {oA.Add(oEl, &#039;&quot; &amp; sUnknownValue &amp; &quot;&#039;); sRes=true}} return sRes;}&quot;
      oSC.AddCode(sJsCode)
      oJRes = oSC.Run(&quot;GetObjectProps&quot;, oBj, oDi)
      
    elseif isArray(oBj) then &#039;Делаем массиву описание вида &quot;array[2x2x3=12]&quot;
      nArrDims = nGetArrayDims(oBj)
      sObj = &quot;array[&quot;
      nElCount = 1
      if nArrDims &gt; 0 then
        for i=1 to nArrDims
          nElCount = nElCount * (UBound(oBj, i) + 1)
          dim sDelim
          if nArrDims = 1 then
            sDelim = &quot;&quot;
          elseif i = nArrDims then
            sDelim = &quot;=&quot;
          else
            sDelim = &quot;,&quot;
          end if
          sObj = sObj &amp; UBound(oBj, i) &amp; sDelim
        next
        if nArrDims &gt; 1 then
          sObj = sObj &amp; nElCount
        end if
      end if
      sObj = sObj &amp; &quot;]&quot;
      
    elseif IsNull(oBj) then
      sObj = &quot;Null&quot; &#039;CStr() не может обработать
      
    else &#039;Остальных просто в строку
      on error resume next 
      sObj = CStr(oBj)
      if Err.Number then
        sObj = sUnknownValue &amp; &quot; &quot; &amp; Err.Description
      end if
      on error goto 0
    end if &#039;Показать сущность
    
    dim sTab : sTab = Space(nPaddingSpace * (nEsting_max - nEsting))
    sRes = sTab &amp; sParentName &amp; sNoSpace4First &amp;&quot;{&quot; &amp; TypeName(oBj) &amp; &quot;#&quot; &amp; VarType(oBJ) &amp;&quot;}=&gt;&quot; &amp; sObj &amp; &quot;&lt;&quot; &amp; VbCrLf
    
    &#039;Показ содержимого сущности, если оно имеется
    if IsObject(oBj) then 
      if TypeName(oBj) = &quot;Dictionary&quot; then
        for each oEl in oBj
          dim sEl
          if IsNumeric(oEl) then
            if VarType(oEl) = 8  then &#039;8 это String (да, бывают одновременно и IsNumeric, и String)
              sEl = &quot;&#039;&quot; &amp; oEl &amp; &quot;&#039;&quot;
            else
              sEl = oEl
            end if
          else
            sEl = &quot;&quot;&quot;&quot; &amp; oEl &amp; &quot;&quot;&quot;&quot;
          end if
          sRes = sRes &amp; vardump(oBj(oEl), sParentName &amp; &quot;[&quot; &amp; sEl &amp; &quot;]&quot;, nEsting-1)
        next
      elseif TypeName(oBj) = &quot;IRegExp2&quot; then
        sRes = sRes &amp; sTab &amp; Space(nPaddingSpace) &amp; &quot;Pattern=&gt;&quot; &amp; oBj.Pattern &amp; &quot;&lt;  Global=&quot; &amp; Abs(oBj.Global) &amp; _
          &quot; IgnoreCase=&quot; &amp; Abs(oBj.IgnoreCase) &amp; &quot; Multiline=&quot; &amp; Abs(oBj.Multiline) &amp; VbCrLf
      elseif oJRes then
        for each oEl in oDi
          sRes = sRes &amp; vardump(oDi(oEl), sParentName &amp; &quot;.&quot; &amp; oEl , nEsting-1)
        next
      else
        on error resume next &#039;Пытаемся обработать объект как коллекцию
        dim sResTmp : sResTmp = &quot;&quot;
        for each oEl in oBj
          if not IsEmpty(oEl) then
            sResTmp = sResTmp &amp; vardump(oEl, sParentName &amp; &quot;*&quot;, nEsting-1)
          end if
          if Err then 
            exit for
          end if
        next
        if not Err then sRes = sRes &amp; sResTmp
        &#039; sRes = sRes &amp; vardump(oBj.Name, sParentName &amp; &quot;.Name&quot;, nEsting-1) &#039;Угадай свойство :)
        on error goto 0
      end if
    elseif isArray(oBj) and nArrDims &gt; 0 then  &#039;Если массив с измерениями, выводим его элементы (рекурсией)
      for i=1 to nArrDims &#039;Делаем словарь счетчиков измерений
        oDi.Add i, 0
      next
      
      for each oEl in oBj &#039;Вывод элементов массива
        if not IsEmpty(oEl) then &#039;Вывод только непустых значений
          dim sObjName : sObjName = sParentName &amp; &quot;[&quot; &#039;Составляем имя элемента &quot;родитель[x,y,z]&quot;
          for i=1 to nArrDims
            sObjName = sObjName &amp; oDi.Item(i)
            if i &lt;&gt; nArrDims then
              sObjName = sObjName &amp; &quot;,&quot;
            end if
          next
          sObjName = sObjName &amp; &quot;]&quot;
          sRes = sRes &amp; vardump(oEl, sObjName, nEsting-1)
        end if
        
        oDi.Item(1) = oDi.Item(1) + 1
        if nArrDims &gt; 1 then &#039;Если &quot;разрядов&quot; более 1, делаем составной счетчик
          for i=1 to nArrDims-1
            if oDi.Item(i) &gt; UBound(oBj, i) then 
              oDi.Item(i) = 0
              oDi.Item(i+1) = oDi.Item(i+1) + 1
            end if
          next
        end if &#039;составной счетчик
      next &#039;Вывод элементов массива
    end if &#039;Если массив

  else
    sRes = sParentName &amp; &quot; ! Nesting limit !&quot; &amp; VbCrLf
  end if
  vardump = sRes
end function

&#039; Упрощенная версия: объект, его название
sub vard2 (byref oBj, byval sParentName)
  on error resume next
  WScript.Echo(vardump(oBj, sParentName, 20))
  if Err then
    WScript.Echo &quot;vardump() Error &quot; &amp; Err.Number &amp; &quot; &quot; &amp; Err.Description
  end if
end sub

&#039; Упрощенная версия: только объект
sub vard(byref oBj)
  call vard2(oBj, &quot;&quot;)
end sub

&#039;Возвращает число измерений массива
function nGetArrayDims(arr)
  if not isArray(arr) then
    nGetArrayDims = -1 &#039;Не массив - индикатор ошибки
    exit function
  end if
  dim nElCount, i, nCurElCount
  nElCount = 0
  for each i in arr &#039;Всего элементов в массиве
    nElCount = nElCount + 1
  next
  if nElCount = 0 then
    nGetArrayDims = 0 &#039;Динамический, не определен
    exit function
  end if
  nGetArrayDims = 1
  nCurElCount = UBound(arr) + 1
  while nElCount &gt; nCurElCount
    nGetArrayDims = nGetArrayDims + 1
    nCurElCount = 1
    for i = 1 to nGetArrayDims
      nCurElCount = nCurElCount * (UBound(arr, i) + 1)
    next
  wend
end function</code></pre></div><p>Использование: <br /></p><div class="codebox"><pre><code>vard переменная
vard2 переменная, &quot;описание переменной, например ее имя&quot;</code></pre></div><p>Отдельно прилагается объект для тестирования.<br /></p><div class="codebox"><pre><code>&#039;Объект для демонстрации возможностей
class MyObj
  dim p1
  public p2
  private p3
  
  property let prop1(value)
    p1 = value
  end property
  
  property get prop1
    prop1 = p1
  end property
  
  function a 
    a = true
  end function

end class

dim obj
set obj = new MyObj
obj.p1 = &quot;123&quot;

dim oD : set oD = CreateObject(&quot;Scripting.Dictionary&quot;)
oD.Add &quot;number1&quot;, 1 
oD.Add &quot;2&quot;, &quot;22&quot; 
oD.Add 2.3, obj
oD.Add &quot;Nothing&quot;, Nothing

dim oRE : set oRE = CreateObject(&quot;VBScript.RegExp&quot;)
oRE.IgnoreCase = true
oRE.Pattern = &quot;\S+&quot;
oRE.Global = true
oD.Add true, oRE

dim arr0()
oD.Add &quot;пустой массив&quot;, arr0

dim arr1(2)
arr1(1) = 0.1
arr1(2) = CLng(1)
oD.Add &quot;одномерный&quot;, arr1

dim arr2 : arr2 = Array(1, arr1, &quot;4&quot;)
oD.Add &quot;одномерный Array()&quot;, arr2

dim arr3(2,2,2)
arr3(1,1,1) = Null
arr3(1,2,1) = Now
oD.Add &quot;многомерный&quot;, arr3

dim oFS : set oFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
dim oGF : set oGF= oFS.GetFile(WSH.ScriptName)

oD.Add &quot;FileSystemObject&quot;, oFS
oD.Add &quot;FileSystemObject Drives&quot;, oFS.Drives
oD.Add &quot;SomeFile&quot;, oGF
oD.Add &quot;WScript&quot;, WSH
oD.Add &quot;Err&quot;, Err

dim oSC : set oSC = CreateObject(&quot;ScriptControl&quot;)
oSC.Language = &quot;JScript&quot;
oSC.AddCode(&quot;function inner(){return 22;}&quot;)
oSC.AddCode(&quot;function a2() {}&quot;)
oD.Add &quot;ScriptControl.Procedures&quot;, oSC.Procedures

vard2 oD, &quot;Составной объект&quot;

&#039; Выведет
&#039; Составной объект {Dictionary#9}=&gt;(object)&lt;
  &#039; Составной объект[&quot;number1&quot;] {Integer#2}=&gt;1&lt;
  &#039; Составной объект[&#039;2&#039;] {String#8}=&gt;22&lt;
  &#039; Составной объект[2,3] {MyObj#9}=&gt;(object)&lt;
    &#039; Составной объект[2,3].prop1 {String#8}=&gt;123&lt;
    &#039; Составной объект[2,3].a {String#8}=&gt;(?)&lt;
    &#039; Составной объект[2,3].p1 {String#8}=&gt;123&lt;
    &#039; Составной объект[2,3].p2 {Empty#0}=&gt;&lt;
  &#039; Составной объект[&quot;Nothing&quot;] {Nothing#9}=&gt;(object)&lt;
  &#039; Составной объект[Истина] {IRegExp2#9}=&gt;(object)&lt;
    &#039; Pattern=&gt;\S+&lt;  Global=1 IgnoreCase=1 Multiline=0
  &#039; Составной объект[&quot;пустой массив&quot;] {Variant()#8204}=&gt;array[]&lt;
  &#039; Составной объект[&quot;одномерный&quot;] {Variant()#8204}=&gt;array[2]&lt;
    &#039; Составной объект[&quot;одномерный&quot;][1] {Double#5}=&gt;0,1&lt;
    &#039; Составной объект[&quot;одномерный&quot;][2] {Long#3}=&gt;1&lt;
  &#039; Составной объект[&quot;одномерный Array()&quot;] {Variant()#8204}=&gt;array[2]&lt;
    &#039; Составной объект[&quot;одномерный Array()&quot;][0] {Integer#2}=&gt;1&lt;
    &#039; Составной объект[&quot;одномерный Array()&quot;][1] {Variant()#8204}=&gt;array[2]&lt;
      &#039; Составной объект[&quot;одномерный Array()&quot;][1][1] {Double#5}=&gt;0,1&lt;
      &#039; Составной объект[&quot;одномерный Array()&quot;][1][2] {Long#3}=&gt;1&lt;
    &#039; Составной объект[&quot;одномерный Array()&quot;][2] {String#8}=&gt;4&lt;
  &#039; Составной объект[&quot;многомерный&quot;] {Variant()#8204}=&gt;array[2,2,2=27]&lt;
    &#039; Составной объект[&quot;многомерный&quot;][1,1,1] {Null#1}=&gt;Null&lt;
    &#039; Составной объект[&quot;многомерный&quot;][1,2,1] {Date#7}=&gt;02.12.2010 18:33:34&lt;
  &#039; Составной объект[&quot;FileSystemObject&quot;] {FileSystemObject#9}=&gt;(object)&lt;
  &#039; Составной объект[&quot;FileSystemObject Drives&quot;] {Drives#9}=&gt;(object)&lt;
    &#039; Составной объект[&quot;FileSystemObject Drives&quot;]* {Drive#8}=&gt;(object)&#039;C:&#039;&lt;
    &#039; Составной объект[&quot;FileSystemObject Drives&quot;]* {Drive#8}=&gt;(object)&#039;D:&#039;&lt;
  &#039; Составной объект[&quot;SomeFile&quot;] {File#8}=&gt;(object)&#039;D:\00\Scripts\_base\test.vbs&#039;&lt;
  &#039; Составной объект[&quot;WScript&quot;] {Object#8}=&gt;(object)&#039;Сервер сценариев Windows&#039;&lt;
  &#039; Составной объект[&quot;Err&quot;] {Object#3}=&gt;(object)&lt;
  &#039; Составной объект[&quot;ScriptControl.Procedures&quot;] {IScriptProcedureCollection#9}=&gt;(object)&lt;
    &#039; Составной объект[&quot;ScriptControl.Procedures&quot;]* {IScriptProcedure#8}=&gt;(object)&#039;inner&#039;&lt;
    &#039; Составной объект[&quot;ScriptControl.Procedures&quot;]* {IScriptProcedure#8}=&gt;(object)&#039;a2&#039;&lt;</code></pre></div><p><strong>Замечания</strong></p><p>Наличие в {скобках} значения как TypeName(), так и VarType(), думаю, будет не лишним: можно наблюдать, как некоторые объекты (FileSystemObject.File, WSH и т.п.) возвращают в VarType() типы своих свойств по умолчанию, как правило - строк, а не 9 объекта. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Неочевидная особенность, впрочем упомянутая в документации.</p><p>Для запуска JScript вместо <em>htmlfile</em> используется <em>ScriptControl</em>. Функциональность та же, переменных и кода меньше. Плюс при ошибках во &quot;внешнем&quot; коде жалуется в исходный, а не молча падает как в htmlfile, что существенно облегчает отладку. А если посмотреть <a href="http://forum.script-coding.com/viewtopic.php?id=4481">OLE/COM браузером</a> в соответствующую библиотеку типов &quot;Microsoft Script Control 1.0&quot;... то можно открывать отдельную тему, посвященную изучению функциональности данного объекта: обработка ошибок, перечисление процедур/функций в коде, требуемых ими параметров, ограничение времени исполнения, несколько методов выполнения (Run, Eval, ExecuteStatement).</p><p>В связи с тем, что TypeName() возвращает конкретные названия &quot;подтипов&quot; можно и далее расширять функциональность, добавляя свойства известных объектов и коллекций (File, Files, Drive и др.) Я же остановился на классических множествах.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Thu, 02 Dec 2010 14:05:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=42424#p42424</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=42042#p42042</link>
			<description><![CDATA[<p>Ясно. Я вполне себе обхожусь WScript.Echo <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 21 Nov 2010 19:01:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=42042#p42042</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=42041#p42041</link>
			<description><![CDATA[<p>Функцию предполагается использовать для отладки.<br />У меня на компе 3 отладчика: VS2005 (долго грузится, фу), MS Script debugger (лучше бы его удалить из списка) и MS Script editor из Office (вполне информативен и быстр). Но в основном пользуюсь в JScript таким <a href="http://forum.script-coding.com/viewtopic.php?id=4395">дампером</a> - им удобней делать частые простые проверки... Теперь хочу такой же для vbs. Я что-то делаю не так?</p><p>А еще удобно вешать дампер на условную ветку возникновения непредвиденной ситуации и сливать в лог, чтобы потом - по прошествии времени - смотреть, что случалось и из-за чего. Хотя это не столь часто бывает надо, да и обычными средствами можно обойтись.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 21 Nov 2010 18:44:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=42041#p42041</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=42016#p42016</link>
			<description><![CDATA[<div class="quotebox"><cite>jite пишет:</cite><blockquote><p>Можно ли в VBS как-то обойти свойства объекта подобно методу js?</p></blockquote></div><p>Насколько я знаю — нет. Для внешних объектов (в том числе и реализованных на *.wsc) можно пользоваться браузером объектов, дабы посмотреть свойства/методы объекта. А для внутренних, созданных посредством «Class…End Class» зачем сие нужно?</p><p>При реализации WMI сразу заложили подобную возможность, а именно: объект «WbemObject» обладает свойствами «.Properties_»/«.Methods_» позволяющими обращаться к свойствам/методам объекта посредством перечисления, не зная их заранее. Например:<br /></p><div class="codebox"><pre><code>Option Explicit

&#039; Enum WbemCimtypeEnum
Const wbemCimTypeEmpty     = &amp;H0000
Const wbemCimTypeSInt16    = &amp;H0002
Const wbemCimTypeSInt32    = &amp;H0003
Const wbemCimTypeReal32    = &amp;H0004
Const wbemCimTypeReal64    = &amp;H0005
Const wbemCimTypeString    = &amp;H0008
Const wbemCimTypeBoolean   = &amp;H000B
Const wbemCimTypeObject    = &amp;H000D
Const wbemCimTypeSInt8     = &amp;H0010
Const wbemCimTypeUInt8     = &amp;H0011
Const wbemCimTypeUInt16    = &amp;H0012
Const wbemCimTypeUInt32    = &amp;H0013
Const wbemCimTypeSInt64    = &amp;H0014
Const wbemCimTypeUInt64    = &amp;H0015
Const wbemCimTypeDateTime  = &amp;H0065
Const wbemCimTypeReference = &amp;H0066
Const wbemCimTypeChar16    = &amp;H0067
Const wbemCimTypeIllegal   = &amp;H0FFF
Const wbemCimTypeFlagArray = &amp;H2000


Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx
Dim objSWbemObjectEx_InParams

Dim collSWbemPropertySet
Dim objSWbemProperty

Dim collSWbemMethodSet
Dim objSWbemMethod

Dim elem

Dim dtCimType

Set dtCimType = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)

dtCimType.Add wbemCimTypeEmpty,     &quot;CimTypeEmpty&quot;
dtCimType.Add wbemCimTypeSInt16,    &quot;CimTypeSInt16&quot;
dtCimType.Add wbemCimTypeSInt32,    &quot;CimTypeSInt32&quot;
dtCimType.Add wbemCimTypeReal32,    &quot;CimTypeReal32&quot;
dtCimType.Add wbemCimTypeReal64,    &quot;CimTypeReal64&quot;
dtCimType.Add wbemCimTypeString,    &quot;CimTypeString&quot;
dtCimType.Add wbemCimTypeBoolean,   &quot;CimTypeBoolean&quot;
dtCimType.Add wbemCimTypeObject,    &quot;CimTypeObject&quot;
dtCimType.Add wbemCimTypeSInt8,     &quot;CimTypeSInt8&quot;
dtCimType.Add wbemCimTypeUInt8,     &quot;CimTypeUInt8&quot;
dtCimType.Add wbemCimTypeUInt16,    &quot;CimTypeUInt16&quot;
dtCimType.Add wbemCimTypeUInt32,    &quot;CimTypeUInt32&quot;
dtCimType.Add wbemCimTypeSInt64,    &quot;CimTypeSInt64&quot;
dtCimType.Add wbemCimTypeUInt64,    &quot;CimTypeUInt64&quot;
dtCimType.Add wbemCimTypeDateTime,  &quot;CimTypeDateTime&quot;
dtCimType.Add wbemCimTypeReference, &quot;CimTypeReference&quot;
dtCimType.Add wbemCimTypeChar16,    &quot;CimTypeChar16&quot;
dtCimType.Add wbemCimTypeIllegal,   &quot;CimTypeIllegal&quot;
dtCimType.Add wbemCimTypeFlagArray, &quot;CimTypeFlagArray&quot;


strComputer = &quot;.&quot;

Set objSWbemLocator    = WScript.CreateObject(&quot;WbemScripting.SWbemLocator&quot;)
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, &quot;root\cimv2&quot;)
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery(&quot;SELECT * FROM Win32_ComputerSystem&quot;) &#039;Win32_WMISetting

For Each objSWbemObjectEx In collSWbemObjectSet
    Set collSWbemPropertySet = objSWbemObjectEx.Properties_
    
    WScript.Echo &quot;Properties&quot;
    WScript.Echo &quot;============================================================&quot;
    
    For Each objSWbemProperty In collSWbemPropertySet
        WScript.Echo &quot;Property name  :&quot;, objSWbemProperty.Name
        WScript.Echo &quot;Property type  :&quot;, dtCimType.Item(objSWbemProperty.CIMType)
        
        If objSWbemProperty.IsArray And Not IsNull(objSWbemProperty.Value) Then
            WScript.Echo &quot;Property values:&quot;
            
            For Each elem In objSWbemProperty.Value
                WScript.Echo vbTab, elem
            Next
        Else
            WScript.Echo &quot;Property value :&quot;, objSWbemProperty.Value
        End If
        
        WScript.Echo
    Next
    
    WScript.Echo &quot;============================================================&quot;
    WScript.Echo &quot;Total properties:&quot;, collSWbemPropertySet.Count
    
    
    Set collSWbemMethodSet = objSWbemObjectEx.Methods_
    
    WScript.Echo &quot;Methods&quot;
    WScript.Echo &quot;============================================================&quot;
    
    For Each objSWbemMethod In collSWbemMethodSet
        WScript.Echo &quot;Method name:&quot;, objSWbemMethod.Name
        
        For Each objSWbemProperty In objSWbemMethod.InParameters.Properties_
            WScript.Echo vbTab, &quot;Argument name  :&quot;, objSWbemProperty.Name
            WScript.Echo vbTab, &quot;Argument type  :&quot;, dtCimType.Item(objSWbemProperty.CIMType)
            
            WScript.Echo
        Next
    Next
    
    WScript.Echo &quot;============================================================&quot;
    WScript.Echo &quot;Total methods:&quot;, collSWbemMethodSet.Count
    
    Exit For
Next

dtCimType.RemoveAll

Set dtCimType = Nothing

WScript.Quit 0</code></pre></div><p>Вы, при желании, можете заложить подобную функциональность в созданный класс.</p><p>P.S. Естественно, ничто не мешает работать со свойствами/методами стандартными средствами, напрямую: <a href="http://msdn.microsoft.com/en-us/library/aa392315(VS.85).aspx">Manipulating Class and Instance Information (Windows)</a>.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 21 Nov 2010 00:18:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=42016#p42016</guid>
		</item>
		<item>
			<title><![CDATA[VBS: Как посмотреть все свойства объекта?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=41985#p41985</link>
			<description><![CDATA[<p>Создаю, объект со свойствами и переменными (кстати, можно ли как-нибудь без класса обойтись?) <br /><strong>Можно ли в VBS как-то обойти свойства объекта подобно <a href="http://forum.script-coding.com/viewtopic.php?id=4395">методу js</a>?</strong><br /></p><div class="codebox"><pre><code>class MyObj
  dim p1, p2, p3
  property let prop1(value)
    p1 = value
  end property
  property get prop1
    prop1 = p1
  end property
end class

dim obj
set obj = new MyObj
obj.p1 = &quot;123&quot;
obj.p2 = 2
WScript.Echo obj.prop1 &amp; &quot; &quot; &amp; obj.p1 &#039;-&gt; &quot;123 123&quot;

dim elem
for each elem in obj &#039;Ошибка выполнения Microsoft VBScript: Объект не поддерживает это свойство или метод
  WScript.Echo elem
next</code></pre></div><p>Прочтены:<br /><a href="http://forum.script-coding.com/viewtopic.php?id=4177">VBScript: Создание пользовательского объекта</a><br /><a href="http://forum.script-coding.com/viewtopic.php?id=1245">VBScript: использование собственных классов</a><br />Испробован метод с созданием объекта <em>htmlfile</em> и внедрением js. Работает на объектах, <span class="bbu">но не понимает массивов, так что не вариант, видимо</span>.<br /></p><div class="codebox"><pre><code>&#039;добавить к коду выше
vard obj
&#039; Возвращает:
&#039; (object)=&gt;&lt;
  &#039; prop1 (string)=&gt;123&lt;
  &#039; p1 (string)=&gt;123&lt;
  &#039; p2 (number)=&gt;2&lt;
  &#039; p3 (undefined)=&gt;undefined&lt;

&#039; dim arr(10)
&#039; arr(0)=2
&#039; vard arr &#039;Возвращает (unknown)=&gt;&lt;

&#039; Возвращает строку рекурсивного описания содержимого объекта oBj
function vardump (byref oBj, byval sParentName, byval nEsting)
  dim sJS
  sJS = &quot;function vardump_js(oBj, sParentName, nEsting) {&quot; &amp; _
  &quot;var nEsting_max = 20;&quot; &amp; _
  &quot;var nPadding = 2;&quot; &amp; _
  &quot;if (typeof (sParentName) == &quot;&quot;undefined&quot;&quot;)&quot; &amp; _
  &quot;  sParentName = &quot;&quot;&quot;&quot;;&quot; &amp; _
  &quot;if (typeof (nEsting) != &quot;&quot;number&quot;&quot;)&quot; &amp; _
  &quot;  nEsting = nEsting_max;&quot; &amp; _
  &quot;var sRes = &quot;&quot;&quot;&quot;;&quot; &amp; _
  &quot;if (nEsting &gt;= 0)&quot; &amp; _
  &quot;{&quot; &amp; _
  &quot;  var nGap = nPadding * (nEsting_max - nEsting);&quot; &amp; _
  &quot;  for ( var i = 0; i &lt; nGap; i++)&quot; &amp; _
  &quot;    sRes += &quot;&quot; &quot;&quot;;&quot; &amp; _
  &quot;  sRes += sParentName + (sParentName == &quot;&quot;&quot;&quot; ? &quot;&quot;&quot;&quot; : &quot;&quot; &quot;&quot;) + &quot;&quot;(&quot;&quot; + typeof (oBj) + &quot;&quot;)=&gt;&quot;&quot; + oBj + &quot;&quot;&lt;\r\n&quot;&quot;;&quot; &amp; _
  &quot;  if (typeof (oBj) == &quot;&quot;object&quot;&quot;)&quot; &amp; _
  &quot;    for ( var oEl in oBj)&quot; &amp; _
  &quot;    {&quot; &amp; _
  &quot;      var sObjName = sParentName;&quot; &amp; _
  &quot;      if (sObjName != &quot;&quot;&quot;&quot;)&quot; &amp; _
  &quot;        sObjName += &quot;&quot;.&quot;&quot;;&quot; &amp; _
  &quot;      sObjName += oEl;&quot; &amp; _
  &quot;      sRes += arguments.callee(oBj[oEl], sObjName, nEsting - 1);&quot; &amp; _
  &quot;    }&quot; &amp; _
  &quot;}&quot; &amp; _
  &quot;else&quot; &amp; _
  &quot;  sRes = sParentName + &quot;&quot; ! Nesting limit !\r\n&quot;&quot;;&quot; &amp; _
  &quot;return(sRes);&quot; &amp; _
  &quot;}&quot;
  dim oDoc, oWindow
  Set oDoc = CreateObject(&quot;htmlfile&quot;)
  Set oWindow = oDoc.parentWindow
  oWindow.execScript sJS,&quot;javascript&quot; &#039;
  vardump = oWindow.vardump_js(oBj, sParentName, nEsting)
end function

&#039; Упрощенная версия с названием
sub vard2 (byref oBj, byval sParentName)
  WScript.Echo(vardump(oBj, sParentName, 20))
end sub

&#039; Упрощенная версия
sub vard(byref oBj)
  call vard2(oBj, &quot;&quot;)
end sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Fri, 19 Nov 2010 23:29:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=41985#p41985</guid>
		</item>
	</channel>
</rss>
