Enumerator

Enumerator

Рассмотрим объект Enumerator.
Сразу следует отметить, что он не относиться к объектной модели сервера сценариев Windows. Однако там он чаще всего и используется. Поскольку в примерах это объект будет встречаться многократно, имеет смысл посвятить отдельную страницу объекту Enumerator.
Enumerator - объект JScript для получения доступа к элементам коллекций.
Следует так же отметить, что в языке vbscript для обработки коллекции применяется цикл For...Each и нет необходимости использовать дополнительные объекты.
У объекта Enumerator нет свойств, а есть только методы. Они позволяют получать доступ к начальному, следующему и текущему элементу коллекции и определить, достигнут ли конец коллекции.
Таким образом, имеется всего 4 метода, которые мы и рассмотрим.

МетодыОписание
atEnd Метод atEnd возвращает true, если текущий элемент коллекции является последним в ней, и false в противном случае.
Возвращаемое значение - Булево.
item Метод item возвращает текущий элемент коллекции.
Если коллекция пуста или текущий элемент не определен, то возвращается значение undefined.
moveFirst Метод moveFirst перемещает указатель на первый элемент коллекции.
Возвращаемое значение - нет.
moveNext Метод moveNext перемещает указатель на следующий элемент коллекции.
Возвращаемое значение - нет.

У всех методов нет параметров.
Для более полного понимания рассмотрим несколько примеров использования объекта Enumerator.
Большинство примеров в той или иной степени заимствованы из документации Microsoft Windows Script. Разумеется, все примеры написаны на JScript.


var x; var fso = new ActiveXObject("Scripting.FileSystemObject"); var fc = new Enumerator(fso.Drives); for (fc.moveFirst(); !fc.atEnd(); fc.moveNext()) { x = fc.item(); s='Drive '+x.DriveLetter+': '; if (x.DriveType == 0) s += "неизвестное устройство "; if (x.DriveType == 1) s += "устройство со сменным носителем "; if (x.DriveType == 2) s += "жёсткий диск " ; if (x.DriveType == 3) s += "сетевой диск "; if (x.DriveType == 4) s += "CD-ROM "; if (x.DriveType == 5) s += "RAM-диск "; if (x.IsReady) { namedisk=(x.DriveType == 3)?x.ShareName:x.VolumeName; s += " Name=" +((namedisk.length > 0 )? namedisk : "[NO NAME] "); s +=" FileSystem="+x.FileSystem; s +=" FreeSpace="+Math.floor(x.FreeSpace/1024) +"КБ"; } else s +=" [disk not ready]"; WScript.Echo(s); }


Здесь используются все методы объекта Enumerator
Рассмотрим строки, непосредственно относящиеся к объекту Enumerator.
Сначала создается объект Enumerator. Это делается в этой строке:

var fc = new Enumerator(fso.Drives);

В заголовке цикла используются методы, позволяющие последовательно осуществить перебор всех элементов коллекции.

for (fc.moveFirst(); !fc.atEnd(); fc.moveNext())

Следует отметить, что при создании коллекции указатель уже устанавливается на первый ее элемент, так что вышеприведенная строка может выглядеть так:

for ( ; !fc.atEnd(); fc.moveNext())

И в следующих примерах присутствует именно такой вид.
Ну и обращение к элементу коллекции.

x = fc.item();

В завершение еще несколько примеров, которые присутствуют в различных частях этого проекта.
Показать список вложенных папок.

function ShowFolderList(folderspec) { var fso, f, fc, s; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.GetFolder(folderspec); fc = new Enumerator(f.SubFolders); s = ""; for (; !fc.atEnd(); fc.moveNext()) { s += fc.item(); s += "\n"; } return(s); }


Показать список файлов в папке.

function ShowFolderFileList(folderspec) { var fso, f, f1, fc, s; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.GetFolder(folderspec); fc = new Enumerator(f.files); s = ""; for (; !fc.atEnd(); fc.moveNext()) { s += fc.item(); s += "\n"; } return(s); }


Вывод всех аккаунтов на компьютере

//Подключились к WMI локального компьютера (".") var root = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Выполнили запрос на получение всех локальных аккаунтов на компьютере var qu="SELECT * FROM Win32_Account where LocalAccount = true and SIDType = 1"; var rezquery = root.ExecQuery(qu); var s=""; for (var it = new Enumerator(rezquery); !it.atEnd(); it.moveNext()) s=s+it.item().Name + " - " + it.item().Description+'\n\n'; WScript.Echo(s);


Обратите внимание на еще одну форму записи оператора цикла для перебора коллекции.

Раз уж зашла речь о формах записи цикла для перебора коллекции, то предыдущий пример можно переписать так:

//Подключились к WMI локального компьютера (".") var root = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Выполнили запрос на получение всех локальных аккаунтов на компьютере var qu="SELECT * FROM Win32_Account where LocalAccount = true and SIDType = 1"; var s=""; for (var it = new Enumerator(root.ExecQuery(qu)); !it.atEnd(); it.moveNext()) s=s+it.item().Name + " - " + it.item().Description+'\n\n'; WScript.Echo(s);




Или даже так:

//Подключились к WMI локального компьютера (".") var root = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Выполнили запрос на получение всех локальных аккаунтов на компьютере var s=""; for (var it = new Enumerator( root.ExecQuery("SELECT * FROM Win32_Account")); !it.atEnd(); it.moveNext()) s=s+it.item().Name + " - " + it.item().Description+'\n\n'; WScript.Echo(s);




Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуетс¤ регистраци¤).









  own counter Valid XHTML 1.0 Strict Valid CSS

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка link О авторе

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка Ссылки О авторе Отправить сообщение Карта сайта Поиск по сайту Главная страница

Copyright © 1999 - 2024  Бронислав Краснер