1

Тема: VBS/JS: перенос массива между языками

Граждане, есть ли возможность в vbs/js c помощью ScriptControl через addcode перенести (или вернуть через eval) массив (Array, Split и т.д.) без промежуточных конкатенаций?

Что-то вроде:

Mass = Array(1,2,3) 
With CreateObject("ScriptControl")
  .Language = "JScript"
  .addcode "function x(a){a.reverse();return a;}"
  MsgBox .eval("x('Mass')(1)")
End With

И касаемо коллекций аналогично интересует решение.

2

Re: VBS/JS: перенос массива между языками

Flasher, мне пока Ваша задача непонятна.

3

Re: VBS/JS: перенос массива между языками

alexii, я создаю массив на vbs, обрабатываю его в js через SC и возвращаю обратно в vbs, чтобы дальше обрабатывать.

4

Re: VBS/JS: перенос массива между языками

Flasher, ясно. Непонятно только, почему именно через ScriptControl, а не просто использовать *.wsf формат скрипта.

5

Re: VBS/JS: перенос массива между языками

alexii
В vbs основной код. Не вижу смысла wsf притягивать.
Так есть возможность?

6

Re: VBS/JS: перенос массива между языками

Притягивать — это как раз извращаться со ScriptControl, вместо того, чтобы использовать предназначенный для этого *.wsf.

Имейте в виду, массив VBScript не то же, что массив в JScript. Массиву VBScript в JScript соответствует VBArray Object, а не Array Object. И, если туда — массив VBScript можно преобразовать, то обратно:

There is currently no way to convert a JScript array into a VBArray.

7

Re: VBS/JS: перенос массива между языками

"alexii пишет:

И, если туда — массив VBScript можно преобразовать

Каким образом?

8

Re: VBS/JS: перенос массива между языками

toArray Method (Windows Scripting - JScript).

9

Re: VBS/JS: перенос массива между языками

alexii
Хорошо, а как правильно в addcode переменную с массивом экспортировать?

Mass = Array(1,2,3)
...
.addcode "var a = new VBArray(Mass); var b = a.toArray();"

10

Re: VBS/JS: перенос массива между языками

Так?

.addcode "var a = Mass; var b = a.toArray();"

11

Re: VBS/JS: перенос массива между языками

alexii, так тоже пробовал, ругается..

Ошибка: 'Mass' - определение отсутствует
Код: 800A1391

12

Re: VBS/JS: перенос массива между языками

Flasher, ну, не знаю . Я предпочитаю указанный выше способ.

13

Re: VBS/JS: перенос массива между языками

Японцы написали в 2004 году

arr=Array("п","р","я","а","g")
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
SC.AddCode("function VBArraySort(vbarray){" & _
"return(new VBArray(vbarray).toArray().sort());}")
Set js=SC.Run("VBArraySort",arr)
WScript.Echo js ''
WScript.Echo TypeName(js) 'JScriptTypeInfo
WScript.Echo js.length '5
For Each item In js
WScript.Echo item
Next

Поиск Google:"ScriptControl WSH VBArray"

14

Re: VBS/JS: перенос массива между языками

badik, к сожалению, это опять же не VBScript'овский массив.

15

Re: VBS/JS: перенос массива между языками

badik, вполне себе вариант.

alexii, объект вроде бы имеет подтип String, но его уже можно обрабатывать в цикле как массив/коллекцию, а это дорогого стоит.

16

Re: VBS/JS: перенос массива между языками

Доступ к элементу по индексу у меня не работает. Само собой, Split(…) работать не будет, в функции, которые используют массивы в качестве параметров, тоже не попользуешь.

17

Re: VBS/JS: перенос массива между языками

alexii
Первое, что я сделал - это проверил Split. Никаких проблем.
По индексу - понятно. Хотя можно ещё поковырять. Есть length, может ещё есть что-то вроде item.

18

Re: VBS/JS: перенос массива между языками

Flasher пишет:

Первое, что я сделал - это проверил Split. Никаких проблем. wink

Беру код отсюда. Добавляю:

WScript.Echo Split(js)

Получаю:

Line:    14
Column:    1
Error:    Несоответствие типа
Code:    800A000D
Source:    Ошибка выполнения Microsoft VBScript

System:    Недопустимые данные.

А у Вас как?

19 (изменено: Flasher, 2013-04-08 19:47:02)

Re: VBS/JS: перенос массива между языками

alexii
Недосып?
Split по умолчанию имеет пробел в качестве разделителя, а не запятую, как в указанном выше коде. К тому же нельзя выводить в окно массив. Как минимум нужно было приписать индекс в скобках.

WScript.Echo Split(js, ",")(1)

И да, я сперва подумал, что речь о заданном массиве:
arr = Split("п,р,я,а,g", ",")

20

Re: VBS/JS: перенос массива между языками

Flasher, каюсь, грешен: дважды написал про Split() имея в виду, разумеется, Join(). Посты выше уже править не буду, дабы не возник диссонанс с ответами.

21

Re: VBS/JS: перенос массива между языками

alexii, а Join тут зачем? я же написал, что js имеет подтип String.

22

Re: VBS/JS: перенос массива между языками

Flasher, ясно.

23

Re: VBS/JS: перенос массива между языками

badik пишет:

Японцы написали в 2004 году

arr=Array("п","р","я","а","g")
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
SC.AddCode("function VBArraySort(vbarray){" & _
"return(new VBArray(vbarray).toArray().sort());}")
Set js=SC.Run("VBArraySort",arr)
WScript.Echo js ''
WScript.Echo TypeName(js) 'JScriptTypeInfo
WScript.Echo js.length '5
For Each item In js
WScript.Echo item
Next

Поиск Google:"ScriptControl WSH VBArray"


Прошу прощения влез в Вашу тему не могу понять как запустить данный код. Потому что задача схожая нужно из VBS -> JS -> VBS. Это скрипт VBS ? Если Вас не затруднит можно пару комментов по коду.

24

Re: VBS/JS: перенос массива между языками

wildwolf007 пишет:

не могу понять как запустить данный код. Это скрипт VBS?

Да, VBS. Неужели не видно? Какие проблемы с его запуском?

wildwolf007 пишет:

Если Вас не затруднит можно пару комментов по коду.

Лучше написать, что конкретно неясно.

25

Re: VBS/JS: перенос массива между языками

Копирую данный код, и переименовываю расширение файла на VBS вылетает ошибка:

строка 2 символ 1 Невозможно создание объекта контейнером ActiveX: 'ScriptControl'

Такое ощущение что необходима какая-то установка дополнительная?
Запуск произвожу на Windows 7.

Непонятна вот эта строка:

"SC.AddCode("function VBArraySort(vbarray){" & "return(new VBArray(vbarray).toArray().sort());}")"

26

Re: VBS/JS: перенос массива между языками

Невозможно создание объекта контейнером ActiveX: 'ScriptControl'

решается так:

%windir%\SysWOW64\cscript.exe имя-vbs-файла
( 2 * b ) || ! ( 2 * b )

27

Re: VBS/JS: перенос массива между языками

wildwolf007
По строке:
AddCode - метод ScriptControl, куда и прописывается код указанного языка.
В коде, как видно, записана функция с параметром vbarray, который и будет в качестве переменной передаваться через метод Run, который в свою очередь вернёт результат этой функции для дальнейшей обработки в VBScript.
В коде js создаётся объект через new VBArray с преобразованием переменной из VBS в массив JS с последующим выполнением метода сортировки.

28

Re: VBS/JS: перенос массива между языками

Ну, вот. А кто-то говорил, что «ScriptControl идёт в комплекте даже с XP».

Загрузите и установите: Download Windows Script Control from Official Microsoft Download Center.

29

Re: VBS/JS: перенос массива между языками

Дословно несколько иначе говорилось. Но, судя по тому, что предложил Rumata, дело может быть не в наличии библиотеки.

30

Re: VBS/JS: перенос массива между языками

Дословно несколько иначе говорилось.

Дословно может быть. Но суть была именно в том, что «ничего не устанавливал, указанный компонент идёт в комплекте с ОС».

Но, судя по тому, что предложил Rumata, дело может быть не в наличии библиотеки.

Может быть. Вот как обзаведусь x64 — сразу буду помнить такое .

31

Re: VBS/JS: перенос массива между языками

Rumata пишет:

Невозможно создание объекта контейнером ActiveX: 'ScriptControl'

решается так:

%windir%\SysWOW64\cscript.exe имя-vbs-файла

Понимаю, что вопрос многократно обсуждался, но добавлю пару слов. Я нахожу размещение проверки архитектуры в коде скрипта более универсальным решением - он заработает даже у тех, кто не знает о существовании папки SysWOW64. Например так:

CheckOSx86x64Args()

Rem основной код начинается здесь
Rem примеры некоторых ActiveX, не имеющих 64x реализации
Set SC = CreateObject("ScriptControl")
Set JRO = CreateObject("JRO.JetEngine")
Set DAO = CreateObject("DAO.DBEngine.36")
CreateObject("ADOX.Catalog").Create "Provider = Microsoft.Jet.OLEDB.4.0;Data Source='C:\test.mdb';"
CreateObject("ADODB.Connection").Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\test.mdb';"

Sub CheckOSx86x64Args()
    Dim CmdLn, Arg
    With CreateObject("WScript.Shell")
        If Replace(LCase(WScript.Path), LCase(.ExpandEnvironmentStrings("%windir%\")), "") = "system32" Then
            CmdLn = Replace(LCase(WScript.FullName), "system32", "syswow64")
            If CreateObject("Scripting.FileSystemObject").FileExists(CmdLn) Then
                CmdLn = CmdLn & " """ & WScript.ScriptFullName & """"
                For Each Arg In WScript.Arguments
                    CmdLn = CmdLn & " """ & Arg & """"
                Next
                .Run CmdLn
                WScript.Quit
                End If
        End If
    End With
End Sub
alexii пишет:

А кто-то говорил, что «ScriptControl идёт в комплекте даже с XP».

Скорее всего, проблема была в попытке запуска несуществующей x64 версии ScriptControl. А x32 ScriptControl вроде вполне себе нативен в Win.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

32

Re: VBS/JS: перенос массива между языками

Всё, всё, запинали , сдаюсь…

33

Re: VBS/JS: перенос массива между языками

omegastripes пишет:
Rumata пишет:

Невозможно создание объекта контейнером ActiveX: 'ScriptControl'

решается так:

%windir%\SysWOW64\cscript.exe имя-vbs-файла

Понимаю, что вопрос многократно обсуждался, но добавлю пару слов. Я нахожу размещение проверки архитектуры в коде скрипта более универсальным решением - он заработает даже у тех, кто не знает о существовании папки SysWOW64. Например так:

CheckOSx86x64Args()

Rem основной код начинается здесь
Rem примеры некоторых ActiveX, не имеющих 64x реализации
Set SC = CreateObject("ScriptControl")
Set JRO = CreateObject("JRO.JetEngine")
Set DAO = CreateObject("DAO.DBEngine.36")
CreateObject("ADOX.Catalog").Create "Provider = Microsoft.Jet.OLEDB.4.0;Data Source='C:\test.mdb';"
CreateObject("ADODB.Connection").Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\test.mdb';"

Sub CheckOSx86x64Args()
    Dim CmdLn, Arg
    With CreateObject("WScript.Shell")
        If Replace(LCase(WScript.Path), LCase(.ExpandEnvironmentStrings("%windir%\")), "") = "system32" Then
            CmdLn = Replace(LCase(WScript.FullName), "system32", "syswow64")
            If CreateObject("Scripting.FileSystemObject").FileExists(CmdLn) Then
                CmdLn = CmdLn & " """ & WScript.ScriptFullName & """"
                For Each Arg In WScript.Arguments
                    CmdLn = CmdLn & " """ & Arg & """"
                Next
                .Run CmdLn
                WScript.Quit
                End If
        End If
    End With
End Sub
alexii пишет:

А кто-то говорил, что «ScriptControl идёт в комплекте даже с XP».

Скорее всего, проблема была в попытке запуска несуществующей x64 версии ScriptControl. А x32 ScriptControl вроде вполне себе нативен в Win.


Так и есть у меня windows 7 64 разрядная значит тогда этого компонента нет под 64 разрядную ОС?

34

Re: VBS/JS: перенос массива между языками

Тогда получается решение alexii  в 8м посте становится самым лучшим решением т.к. будет работать на любой версии windows.

35

Re: VBS/JS: перенос массива между языками

wildwolf007
Зачем оверквотить? Некрасиво..
Компонент должен быть под x32. Читайте внимательно, что пишут. Задача задействовать 32-битный интерпретатор. 8-й пост вообще никаким боком не касается решения проблемы вызова, там указан метод преобразования, который и задействован в примере badik.

36 (изменено: wildwolf007, 2014-02-24 00:35:12)

Re: VBS/JS: перенос массива между языками

Flasher пишет:

wildwolf007
Зачем оверквотить? Некрасиво..
Компонент должен быть под x32. Читайте внимательно, что пишут. Задача задействовать 32-битный интерпретатор. 8-й пост вообще никаким боком не касается решения проблемы вызова, там указан метод преобразования, который и задействован в примере badik.

Прошу прощения в мире VBS недавно могу чего-то не понимать и оверквотить не собирался хочу разобраться. Тема заключается в передаче параметров из одного языка в другой и как я понял в 8м посте передача произвелась через массив. Вам нужно было передать через ScriptControl что б исключить лишние операции, но у меня на 64 разрядной винде данный объект не работает и соответственно получается лучше тогда использовать только через массив и с лишними операциями. Так же? Зато будет работать и на 32 битных и на 64 битных ос.

37

Re: VBS/JS: перенос массива между языками

wildwolf007
Ладно бы дело состояло в мире VBS. Читать-то будете, что пишут?
1. Вы похоже не понимаете, что такое избыточное цитирование.
2. Ещё раз по 8-му посту. Там ссылка на метод. С этим понятно? Альтернативы же коснулось в ранних постах, предлагалось использование wsf. Примеров wsf на форуме хватает.
3. Если у Вас что-то не работает, то пишите об этом на основании выше предложенных выходов из ситуации с описанием ошибок.

38

Re: VBS/JS: перенос массива между языками

wildwolf007, мой пример из #31 выполняется без ошибок?

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

39

Re: VBS/JS: перенос массива между языками

Да выполняется без ошибок создает на диске C:\ файл акцесса

40

Re: VBS/JS: перенос массива между языками

wildwolf007 пишет:

Да выполняется без ошибок

Следовательно, строка

Set SC = CreateObject("ScriptControl")

выполняется так же без ошибок, и у Вас

wildwolf007 пишет:

на 64 разрядной винде данный объект

работает нормально. Вам остается только реализовать задуманное с его применением, и убрать лишние строки из примера.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251