1

Тема: JScript -> VBScript: Объекты на VBScript

Прочитал веточку в этом форуме JScript: Чтение INI файлов.
Приведенный пример функции работы с INI файлами мне как раз и нужен, но есть небольшая проблема - нет практического опыта работы на JScript. Смысл функции мне понятен, но не совсем понятно, как  реализовать аналог на VBScript. Т.е. конкретнее вопрос можно упростить - не всю функцию переделывать, а хотя бы как управлятся с объектами на VBScript?
Например, как подобный код JScript реализовать на VBScript?

var INI = {}; // В этом объекте INI будет че-то хранится
var section, param, value;

// Формируем первое значение объекта
section = "ляляля";
INI[section] = {};
param = "бебебе";
value = "Значение!";
INI[section][param] = value;

WScript.Echo(INI.ляляля.бебебе);   // Проверяем, что значение на месте

// Формируем второе значение объекта
section = "тратата";
INI[section] = {};
param = "вот_это_да";
value = "Уряяя!";
INI[section][param] = value;

WScript.Echo(INI.ляляля.бебебе);    // Проверяем, что первое значение НЕ ПОТЕРЯЛОСЬ!
WScript.Echo(INI.тратата.вот_это_да);    // ... а второе добавилось!

// вот этот цикл самый интересный можно вытащить и наименование и его значение
for (var prop in INI.тратата)
   WScript.Echo (prop + "=" + INI.тратата[prop]);

Пока в голове возникает аналогия с массивами, но ведь тут, строго говоря, идет работа с объектами

2

Re: JScript -> VBScript: Объекты на VBScript

OFF: Я не забиваю себе голову и пользуюсь сторонними библиотеками, например AutoItX3.dll: IniDelete, IniRead, IniWrite.

3

Re: JScript -> VBScript: Объекты на VBScript

Dictionary?

( 2 * b ) || ! ( 2 * b )

4

Re: JScript -> VBScript: Объекты на VBScript

AutoItX3.dll - не наш метод, хотя бы потому, что конечный скрипт пишется не для себя, а для распространения. Хочется избежать инструкций пользователям на тему как зарегистрировать стороннюю dll на компе к которому у меня нет доступа, а у пользователя к тому же могут быть ограничены права. А вот просто попросить запускать скрипт в нужный момент щелком мыши - на это сговорится не сложно.

Dictionary может быть и подойдет - надо покопать, но уж больно приведенный вариант на JSCript красиво и лаконично смотрится. Неужели прямого аналога создания ПУСТОГО объекта в VBScript нет?

5

Re: JScript -> VBScript: Объекты на VBScript

VBScript: Создание пользовательского объекта
VBScript: использование собственных классов

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

6

Re: JScript -> VBScript: Объекты на VBScript

А вот просто попросить запускать скрипт в нужный момент щелком мыши - на это сговорится не сложно.

Пользователю разрешено запускать WSF-файлы? Тогда внечите тот JS-файл в WSF, а остальную работу выполняйте на VBScript:
Вот минимальный код

<?xml version="1.0" encoding="utf-8" ?>
<package>
<job id="wsf">
<script language="javascript"><![CDATA[
var INI = {
    str: 'string', 
    boo: true, 
    num: Math.PI, 
    arr: [1, 2, 3], 
    obj: {a: 1}, 
    nul: null
};
]]></script>
<script language="vbscript"><![CDATA[
WScript.Echo(INI.str)
WScript.Echo(INI.boo)
WScript.Echo(INI.num)
WScript.Echo(INI.arr)
WScript.Echo(INI.obj.a)
WScript.Echo(INI.nul)
]]></script>
</job>
</package>
( 2 * b ) || ! ( 2 * b )

7 (изменено: Sphinx70, 2010-10-21 12:32:13)

Re: JScript -> VBScript: Объекты на VBScript

Всем спасибо. В оконцовке изначально запрошенные способы обращения с объектами в VBScript не понадобились. Точнее, при решении данной частной задачи чтения ini-файла может случится сбой ввиду того, что объекты VBScript не понимают русских имен переменных.
Обратите внимание на пример: вытащить свойство объекта INI с русскими именами типа INI.ляляля.бебебе - не выйдет. А в JScript - это работает на ура. Аналогично в примере с WSF, стоит заменить переменную str на русское буквосочетание стр - тоже будет ошибка.
Кстати и помимо данного обстаятельства, использования WSF для меня не очень удачное решение, так как я считаю, что смешивать оба варианта скриптов - не есть гууд. Более разумно придерживаться какого-то одного варианта привычного языка с читабельным текстом. WSF хорош все таки для создания библиотек или уж совсем нерешаемой экзотики.
Так или иначе вариант скрипта на JScript, который читает INI-файлы, удалось перевести на VBScript используя объект Dictionary
Приведу код, может кого заинтересует

Option Explicit
Dim d
Set d = ReadINIFile("C:\Program Files\Totalcmd\Wincmd.ini") ' Целевой объект
Msgbox d.Item("Configuration").Item("Editor")
WScript.Quit

Function ReadINIFile(sIniFile)
    Dim section, aL, i, oIni
    Set oIni = CreateObject("Scripting.Dictionary")
    with CreateObject("Scripting.FileSystemObject")
        if .FileExists(sIniFile) And .GetFile(sIniFile).Size > 0 then aL = Split(.OpenTextFile(sIniFile).ReadAll(), vbCrLf)
    end with
    if IsArray(aL) then
        with CreateObject("VBScript.RegExp")
            .Global = True
            for i = 0 to UBound(aL)
                .Pattern = "^\[(\w+)\]"
                if .Test(aL(i)) = True then 
                    section = .Replace(aL(i), "$1")
                    oIni.Add section, CreateObject("Scripting.Dictionary")
                end if                
                .Pattern = "^([^;#][^=]*?)\s*=\s*([^\r\n]*?)\s*$"
                 On Error resume next
                 if .Test(aL(i)) = True then oIni.Item(section).Add .Replace(aL(i), "$1"), .Replace(aL(i), "$2")
            next
        end with
    end if
    Set ReadINIFile = oIni: Set oIni = Nothing: Set aL = Nothing
End Function

Пример обращения к целевому объекту по аналогии с исходником на JScript оставлен только один, хотя конечно тему развить можно и далее

Сравните: WScript.Echo(INI.Configuration.Editor); и d.Item("Configuration").Item("Editor")
По моему вполне сопоставимые по удобству обращения к переменной Editor заключенной в секции Configuration.

P.S. Если применять русскоязычные названия секций и/или переменных в тестовом INI-файле, то в моем варианте почему-то выскакивает ошибка, хотя теоретически объект Dictionary такие названия ключей вполне допускает.