201

Re: WSH: обмен данными и объектами между скриптами — 2

teadrinker пишет:

Так как объект с CLSID {C08AFD90-F2A1-11D1-8455-00A0C91F3880} — это обычный объект Shell Window, то в качестве подобного контейнера может быть использовано любое существующее окно Проводника, например Рабочий стол. Я не владею WSH, поэтому пример на AHK (который, думаю, легко переписать на vbs).
Первый скрипт:

#Requires AutoHotkey v2
Persistent

VT_UI4 := 0x13, SWC_DESKTOP := 0x8
shellWindows := ComObject('Shell.Application').Windows
desktopShellWindow := shellWindows.Item(ComValue(VT_UI4, SWC_DESKTOP))
desktopShellWindow.PutProperty('myObj', {key: 'Hello!'})

Второй скрипт:

#Requires AutoHotkey v2

VT_UI4 := 0x13, SWC_DESKTOP := 0x8
shellWindows := ComObject('Shell.Application').Windows
desktopShellWindow := shellWindows.Item(ComValue(VT_UI4, SWC_DESKTOP))
MsgBox desktopShellWindow.GetProperty('myObj').key

Одна проблема: если Проводник перезапустить, данные будут потеряны.

Так это и было понятно с первого раза. Передача инфы только через память локального компа на котором крутятся скрипты.
Поэтому  с сетью "такое" не прокатит. Хотя как утверждает Микрософт "сериализация" их  такое может сделать

202

Re: WSH: обмен данными и объектами между скриптами — 2

Если было понятно "с первого раза", то зачем создавать новый объект Shell Window, когда Рабочий стол всегда имеется?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

203

Re: WSH: обмен данными и объектами между скриптами — 2

teadrinker Так у вас тоже организуется ссылка на рабочий стол. И в том скрипте у НЕГО, тоже также. А вот поиск у НЕГО той проги которая задействована для передачи осуществляется через поиск атрибута, записанного как метка в 1.vbs. С вашим рабочий столом никакой проверки не надо делать вообще. На тот момент наверное не было вообще представление того что у всех СОМ микрософта есть этот GetProperty. Но возможно на тот момент у микрософта не было ещё у  рабочего стола этого. Со временем всё меняется, всё развивается.

204

Re: WSH: обмен данными и объектами между скриптами — 2

3wedsmncjklvjvd73734 пишет:

Так у вас тоже организуется ссылка на рабочий стол. И в том скрипте у НЕГО, тоже также.

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

3wedsmncjklvjvd73734 пишет:

На тот момент наверное не было вообще представление того что у всех СОМ микрософта есть этот GetProperty

Почему у всех, только у Shell Window, который реализует IWebBrowser2 interface.

3wedsmncjklvjvd73734 пишет:

Но возможно на тот момент у микрософта не было ещё у  рабочего стола этого

Это маловероятно, Рабочий стол — это такое же окно, как и другие окна Проводника, и его объект Shell Window также реализует IWebBrowser2.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

205 (изменено: 3wedsmncjklvjvd73734, 2025-09-15 08:43:51)

Re: WSH: обмен данными и объектами между скриптами — 2

Мне кажется что я кое что придумал как, связывать между собой машины в иннете с работающими там vbs-ками которые будут передавать друг другу данные.
Есть такой постоянный работающий сервис как "Алиса".
Вот её я и предлагаю использовать как перевалочную станцию для данных.
-->
сама алиса hxxps://dialogs.yandex.ru/
и что нам предлагают в яндексе, как программерам
hxxps://yandex.ru/dev/dialogs/alice/doc … rogramming
...
конечно нужно будут вносить свои данные при регистрации. Но зато "передавай/получай" 24/7  - нет проблем.
Но есть и другие бесплатные сервисы, работающие 24/7 в иннете, и не только алиса.


teadrinker
Я переписал  на VBS вашу версию с "рабочим столом" .
Она (ваша версия) с "рабочим столом" пашет так же как и с проводником.
файл 1.vbs


Option Explicit
Class GlobalObject
    Private ShellWindow, ShellWindows

    Sub OpenContainer(name)
        Dim ShellWindows
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then Exit Sub
        Next
'        Set ShellWindow = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 
' - в версии с рабочим столом не создавать новый объект (рабочий стол)
        Set ShellWindow = GetObject("{00021400-0000-0000-C000-000000000046}")
        ShellWindow.StatusText = name
    End Sub
    
    Property Let Value(name, newValue)    
        ShellWindow.PutProperty name, newValue
    End Property
    
    Public Default Property Get Value(name)
        On Error Resume Next
        if IsObject(ShellWindow.GetProperty(name)) Then
            Set Value = ShellWindow.GetProperty(name)
        Else
            Value = ShellWindow.GetProperty(name)
        End if
    End Property
End Class


Dim GlobalObj, fso
Set GlobalObj = New GlobalObject

set fso = CreateObject("Scripting.FileSystemObject")

GlobalObj.OpenContainer "storage"
GlobalObj("test") = InputBox("Введите значение для глобальной переменной ""test"".")
GlobalObj("fso") = fso

MsgBox "Значения установлены. Теперь, не закрывая это сообщение, запустите 2.vbs"

...
файл 2.vbs


Option Explicit
Class GlobalObject
    Private ShellWindow, ShellWindows

    Sub OpenContainer(name)
        Dim ShellWindows
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then Exit Sub
        Next
'        Set ShellWindow = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
' - в версии с рабочим столом не создавать новый объект (рабочий стол)
        Set ShellWindow = GetObject("{00021400-0000-0000-C000-000000000046}")

        ShellWindow.StatusText = name
    End Sub
    
    Property Let Value(name, newValue)    
        ShellWindow.PutProperty name, newValue
    End Property
    
    Public Default Property Get Value(name)
        On Error Resume Next
        if IsObject(ShellWindow.GetProperty(name)) Then
            Set Value = ShellWindow.GetProperty(name)
        Else
            Value = ShellWindow.GetProperty(name)
        End if
    End Property
End Class

dim GlobalObj
Set GlobalObj = New GlobalObject

GlobalObj.OpenContainer "storage"
MsgBox "Значение переменной ""test"": " & GlobalObj("test") ,vbInformation
MsgBox "Тип переменной ""fso"": " & TypeName(GlobalObj("fso")),vbInformation

ремарка.
teadrinker
Спасибо огромное ВАМ, что помогли нам тут с этим вопросом и нашли простой способ работающего сервиса  "рабочий стол",
который является ключевым в винде и мало вероятно что он сбойнёт и вся инфа потеряется.

206 (изменено: 3wedsmncjklvjvd73734, 2026-01-27 12:19:52)

Re: WSH: обмен данными и объектами между скриптами — 2

Поднимаю тему.
Копаю дальше.
Выкладываю решение проблему с регистрация СОМ объекта WSC

  • Дело было не в бабине, человек сидел в кабине(R)

Короче.
Обычный старый код WSC
файл COM_VBS.wsc


<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<?component error="true" debug="true"?>
<component>
<registration 
 progid="ServerVBS.WSC"
 classid ="{2DB3675C-29EE-470B-ADFC-7AB4C59C987F}"
 version="1.0"/>

<public>

  <property name="hash"><get/><put/></property>
</public>

<implements type="ASP"/>

<script language="VBScript"><![CDATA[
    ' --------------------------------------------------
dim a
    Function mem_(byval aa)
        a=aa
    End Function

]]></script>

<script language="JScript"><![CDATA[

var hash = {};

function get_hash() {
  if(arguments.length)
    return hash[arguments[0]];
  else
    return hash;
}

function put_hash() { 
  var key = arguments[0], prop = arguments[1];
  hash[key] = prop;
mem_(prop)
}





]]></script>
</component>

ремарка С элементами пробы пера добиться глобальной записи переменно как это совершается с проводником и с рабочим столом
и клиентский код на VBS
файл COM.vbs


'*************************************************
'*************************************************
'*************************************************
'*************************************************
'*************************************************
' Регистрация WSC производиться в ком строке от имени админа  
' regsvr32 требует этого. При этом происходи проверка правильности  кода в WSC  
'
'regsvr32 scrobj.dll /n /i:file:\\ваш полный путь к файлу\COM_VBS.wsc
'
' После этой регистрации все VBS коды могут обращаться к WSC не как к файлу а как к COM объекту
' старое обращение выглядело так 
'  Set wsc = GetObject("script:путь к файлу wsc\COM_VBS.wsc")
' теперь объявление этого СОМ объекта происходит по "НАСТОЯЩЕМУ"
' Set wsc =Createobject("ServerVBS.WSC")
'*************************************************
'*************************************************
'*************************************************
'*************************************************
'*************************************************
'*************************************************
option explicit

dim wsc



Set wsc =Createobject("ServerVBS.WSC")

WSH.echo typename(wsc) '- вывод информации вы виде GUID о зарегистрированной переменной "wsc"


wsc.hash("test") = "one" '-- создание нового "свойства test" и одновременная запись туда "one"
WSH.echo wsc.hash("test") '-- вывод результата из свойства "test" one

wsc.hash("test2") = "two" '-- создание нового "свойства test2" и одновременная запись туда "two"
WSH.echo wsc.hash.test2 '-- вывод результата из свойства "test2" two

wsc.hash("test3") = "three" '-- создание нового "свойства test3" и одновременная запись туда "two"
WSH.echo wsc.hash("test3") '-- вывод результата из свойства "test3" three

Set wsc =Nothing



Теперь к объекту progid="ServerVBS.WSC" можно обращаться в стандартном варианте как к "взрослому" СОМ.

207 (изменено: 3wedsmncjklvjvd73734, 2026-01-30 18:32:21)

Re: WSH: обмен данными и объектами между скриптами — 2

Я не там копал. Из этой статьи от Микрософта
xxxx://learn.microsoft.com/en-us/troubl … pplication
стало понятно что мне нужен для пользы дела VS энтепрайс только, а не простой VS Community
Установлю- проверю что надо для сервера с памятью переменных.
Короче. Ещё не всё потеряно.

208 (изменено: 3wedsmncjklvjvd73734, 2026-01-31 18:38:08)

Re: WSH: обмен данными и объектами между скриптами — 2

Ну короче, я "всё узнал" (по крайней мере как я думаю).

  • 1- В VB6 как сказано в верхнем посту (см линк от микрософта), что мол DCOM и траляляля...
    А на самом деле там реализуются статистические данные с помощью установок на форме.
    параметр
    Persistable
    0 иди 1.
    1 запоминает или в тексте данные в форме, любые хоть с переменных, или бинарные.
    0 не запоминает.
    по умолчанию 0.
    При 1 будет создаваться к OCX/EXE файлу файл кеша. И автоматом читается...

  • 2-в VB.NET тоже есть такое.
    Но называется эта штука
    serialization
    xxxx://learn.microsoft.com/ru-ru/dotnet … lization/

    хххх://nweb42.com/books/visual-basic-ne … asic-net/

    Я проверил, пашет на ура.
    файлик быстро читается и пишется. Но можно сохранять и переменную.
    Есть там у VB.NET переменная похожая на VBS Dictionary.
    Так там я сохранял списками и fso и Dictionary и массивы, без применения файлов.
    При этом эта переменная пропадает при перезагрузки, как у проводника.
    А если с файлом то данные остаются даже после перезагрузки.

И кстати, в VB.NET  эта штуковина, заточена и на сетку, что бы передавать и в сетку данные через неё.
Т.е. обеспечивать связь с разными компами.

209 (изменено: 3wedsmncjklvjvd73734, Сегодня 04:55:47)

Re: WSH: обмен данными и объектами между скриптами — 2

Поднему тему.

Если требуется связь между скриптами, то можно "замутить" вот такое-->
Это то что мне выдала Алиса.
Вопрос был такой.
"объясни  подробно команду `%comspec% /c ex0.vbs | ex1.vbs`, 0, True) " 
ответ.

+ открыть спойлер

Разберём команду `%comspec% /c ex0.vbs | ex1.vbs`, 0, True) по частям.

### 1. Основа: `%comspec%`

`%comspec%` — это **системная переменная окружения** Windows, которая хранит путь к текущему командному интерпретатору (обычно `C:\Windows\System32\cmd.exe`).

Использование `%comspec%` гарантирует, что:
- будет запущен именно штатный командный процессор Windows;
- команда будет выполнена в контексте текущей системы, независимо от того, где и как она вызывается.

### 2. Ключ `/c`

`/c` — параметр `cmd.exe`, означающий:
- выполнить указанную команду;
- завершить работу командного интерпретатора после выполнения.

Без `/c` командная строка осталась бы открытой после выполнения.

### 3. Конструкция `ex0.vbs | ex1.vbs`

Символ `|` — это **оператор конвейера** (pipe) в командной строке Windows. Он означает:
- запустить `ex0.vbs`;
- взять вывод (stdout) из `ex0.vbs`;
- передать этот вывод на вход (stdin) программы `ex1.vbs`.

Таким образом:
- `ex0.vbs` выполняется первым и генерирует некоторый вывод;
- этот вывод *не показывается пользователю*, а сразу направляется во второй скрипт;
- `ex1.vbs` получает данные на вход и обрабатывает их.

> **Важно:** для работы конвейера `|` требуется именно командный интерпретатор (`cmd.exe`), поэтому и нужен `%comspec% /c`.

### 4. Параметры `(0, True)`

Эти параметры **не относятся к командной строке**, а являются аргументами метода, который запускает данную команду. Скорее всего, это вызов метода `Run` объекта `WScript.Shell` в VBScript.

Разберём их:
- `0` — параметр `intWindowStyle`:
  - означает, что окно командной строки *не будет показано* (скрытый режим);
  - другие значения могут задавать видимость и размер окна.
- `True` — параметр `bWaitOnReturn`:
  - `True` означает, что скрипт *дождётся завершения* выполняемой команды;
  - только после этого продолжит выполнение;
  - если было бы `False`, команда запустилась бы «в фоне», и скрипт пошёл дальше без ожидания.

### Итоговый смысл команды

Команда:
```vbscript
%comspec% /c ex0.vbs | ex1.vbs", 0, True
```
делает следующее:
1. Запускает командный интерпретатор Windows (`cmd.exe`).
2. В нём выполняет конвейер:
   - сначала запускает скрипт `ex0.vbs`;
   - берёт его вывод и передаёт на вход скрипту `ex1.vbs`.
3. При этом:
   - окно командной строки не показывается (`0`);
   - основной скрипт ждёт завершения выполнения конвейера (`True`).

### Пример сценария использования

Представим, что:
- `ex0.vbs` выводит список файлов в папке;
- `ex1.vbs` читает этот список и делает с ним что‑то (например, архивирует файлы).

Тогда конвейер:
- автоматически передаёт список из первого скрипта во второй;
- всё происходит без участия пользователя и без видимых окон.

### Резюме

- `%comspec% /c` — гарантированный запуск командной строки с последующим завершением.
- `ex0.vbs | ex1.vbs` — конвейер: вывод первого скрипта идёт на вход второму.
- `(0, True)` — запуск без окна и с ожиданием завершения.


210

Re: WSH: обмен данными и объектами между скриптами — 2

К сказанному выше.

ex0.vbs Считывает свой hwnd_1 и передаёт его  ex1.vbs.
В свою очередь ex1.vbs считывает свой hwnd_2 и передаёт по hwnd_1, в
ex0.vbs свой hwnd_2. После этого происходит общение на 2-ух независимых
процессах на cscrip.exe