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);
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуетс¤ регистраци¤).