1 (изменено: RUVATA, 2012-05-30 13:49:04)

Тема: Использование при подключении WSC относительного пути

Всем доброго времени суток...
Имеем *.wsc (Windows Script Component) - насколько я понял, это единственный способ при работе с WSH, хотя бы как-то, худо бедно, но каскадировать библиотеки (подключать скрипты которые в свою очередь сами что либо подключают, как правило скрипты с часто используемым кодом, представленного в виде экспортируемых функций/методов)
Например:D:\SandBox\ScriptDir\wsc\TestCOM.wsc

<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<?component error="true" debug="true"?>
<component>
<registration progid="TestCOM"/>
<public>
    <property name="ScriptingHost" internalName="WScript"/>
    <method name="ShowMSG"/>
</public>
<script language="JScript"><![CDATA[
   function ShowMSG(SomeString){
        WScript.Echo(SomeString)
   };
]]></script>
</component>

Ну и собственно js-скрипт который таки вышеупомянутый wsc использует
Например: D:\SandBox\ScriptDir\wscConnected.js

var objWSC = GetObject ("script:D:\\SandBox\\ScriptDir\\wcs\\TestCOM.wsc")
objWSC.ScriptingHost = WScript
objWSC.ShowMSG('Hello from TestCOM.wsc !')

Так, вот мой вопрос к коллективному разуму, заключается в следующем:
Можно ли при обращении к объекту из скрипта как либо использовать относительный путь?
применимо к данной ситуации что-то вроде::

var objWSC = GetObject ("script:wsc\\TestCOM.wsc")
Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

2

Re: Использование при подключении WSC относительного пути

Из описания

JScript 
GetObject Function (JScript 5.6) 

Returns a reference to an Automation object from a file.

GetObject([pathname] [, class])

Arguments
pathname
Optional. Full path and name of the file containing the object to retrieve. If pathname is omitted, class is required.
...

Как видите - только полные путь и имя. Вы можете вычислить полный путь относительно запущенного скрипта:


var dirname = WScript.ScriptFullName.replace(/[^\\]+$/, '');

var objWSC = GetObject ("script:" + dirname + "TestCOM.wsc")
( 2 * b ) || ! ( 2 * b )

3

Re: Использование при подключении WSC относительного пути

Спасибо, этот вариант лишь частично, но все же решает проблему распространения подобных решений...

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

4

Re: Использование при подключении WSC относительного пути

RUVATA, подобную проблему вроде как должно решать размещение компонента на сетевом ресурсе.

5

Re: Использование при подключении WSC относительного пути

RUVATA пишет:

Всем доброго времени суток...
Имеем *.wsc (Windows Script Component) - насколько я понял, это единственный способ при работе с WSH, хотя бы как-то, худо бедно, но каскадировать библиотеки (подключать скрипты которые в свою очередь сами что либо подключают, как правило скрипты с часто используемым кодом, представленного в виде экспортируемых функций/методов)

Если не столь важно работать именно с WSH, то, используя "оболочку" для скриптов в виде HTA-приложения, модули со своими частоиспользуемыми функциями на этапе старта HTA также можно подгружать, указав "src=" в теге "<script>". Например:

<!-- Including_user_function_(VBscript's)  -->
<script language=VBScript src="udf_module_1.vbs"></script>

<!-- Including_user_function_(Jscript's)  -->
<script language=javascript src="udf_module_2.js"></script>

ps."asp" выбран ради подсветки:)

WBR. Roman

6

Re: Использование при подключении WSC относительного пути

Rom5, WSH сие умеет «из коробки» — WSH: пишем сценарии в формате WSF:

Преимущества формата WSF

- поддержка "вложенных" файлов (атрибут "src" тега <script>);

7

Re: Использование при подключении WSC относительного пути

RUVATA пишет:

каскадировать библиотеки (подключать скрипты которые в свою очередь сами что либо подключают

Ни *.wsf, ни *.hta не позволяют что-то там каскадировать…

8

Re: Использование при подключении WSC относительного пути

wisgest, про «каскадировать» я и не говорил .

9 (изменено: RUVATA, 2012-05-31 09:02:06)

Re: Использование при подключении WSC относительного пути

каскад подключаемых библиотек - это такой механизм подключения внешнего исполняемого кода к вызывающему, при котором вызываемый код, так же может требовать подключения внешнего кода и так далее, в идеале такой механизм еще должен гарантировать загрузку лишь одного экземпляра библиотеки, даже если в процессе ветвления на неё существует несколько указателей...
Самый наглядный пример реализованной технологии каскада библиотек, это модульная система в Node.JS (серверный JavaScript (V8))
Фактически такая система отчасти реализована в Qt, особенно если работать через QtQuiсk.
Ну и в "этих ваших дот-нетах" (хотя могу ошибаться) тоже вроде так и есть.

PS:Да, в сторону *.hta , *.htm я уже думал, и даже попробовал... но это опять же решает проблему отчасти:
ну да - я могу подключить скрипты... я даже в этих скриптах через eval(fso.OpenTextFile(foo).ReadAll() и абсолютные пути могу подключать другие скрипты.
относительные пути никак не получается использовать, так как eval будет отрабатывать в контексте это hta/htm , и соответственно все относительные пути будут отстоять от него, а не от подключаемых скриптов.

PPS: Есть правда интересные "костыли" - возможно реализовать некую функцию function include(){...} таким образом, чтобы при исполнении она включала в исполняемый код переменную с абсолютным путем подключаемого скрипта, как уже подсказывали который легко вычисляется (даже если используем символические), ну и собственно обвесить все скрипты которые хотелось бы подключать этой нашей чудо функцией...
но это сравни изобретению велосипеда, изначально не хотелось этого делать... хотя

PPPS: По поводу WSF - все очень круто (мне так сначала показалось), мало того что через тег <script> можно подключать скрипты, так и на разных языках ( очень прельщала перспектива не переводить кучи готового VBScript-кода в JScript потому как я от VB-образных языков ухожу в уныние чуть менее чем полностью.)
Но таки я не нашел как можно WSF подключить к WSF, сколько я понимаю Microsoft предлагает захерачить один такой огромный WSF с кучей <job>-ов внутри.
ну я как-бэ за модульность кода - мне такой подход не по душе

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

10

Re: Использование при подключении WSC относительного пути

RUVATA
Верно ли я понимаю, что Вы хотели бы иметь нечто следующее.

Вы работаете над разработкой некоторого скрипта, назовем его project.js. И У Вас есть набор библиотек (Ваших, найденных в сети, написанных на js или vbs, неважно), которые используются в Вашем проекте. Верно ли, что Вы не хотели бы думать о том, какие библиотеки из имеющихся у Вас могут понадобиться в данный момент, но Вы хотели бы чтобы они все были доступны на момент разработки и Вы не думали бы - какие скрипты уже подключены к project.js?

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

11

Re: Использование при подключении WSC относительного пути

[offtop]Сначала долго вчитывался в Ваш пост, и не мог понять зачем, а главное  - кому Я это написал...
но потом таки заметил M в вашем нике (они у нас с Вами одной буквой отличаются) а по началу принял за свой пост - и впал в 5 мин. счастливого анабиоза[/offtop]

Вы хотели бы чтобы они все были доступны на момент разработки и Вы не думали бы - какие скрипты уже подключены к project.js

Не совсем, я хотел бы имея допустим D:\\scripts\\Network.js, которому для исполнения своего кода необходимы сущности(объекты, классы, функции) объявленные в D:\\scripts\\Utils\\UniUtils.js подключить к D:\\project.js,
т.е. объвив в коде  Network.js

include(\\Utils\\UniUtils.js)

а в коде project.js

include(\\scripts\\Network.js)

и все необходимые скрипты подключались бы каскадом.

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

12

Re: Использование при подключении WSC относительного пути

RUVATA пишет:

я хотел бы имея допустим D:\\scripts\\Network.js, которому для исполнения своего кода необходимы сущности(объекты, классы, функции) объявленные в D:\\scripts\\Utils\\UniUtils.js подключить к D:\\project.js,

Я понял Вас так. Для простоты объяснения я сокращу имена скриптов до абстрактных. Есть два зависимых скрипта A.js и B.js. Надо использовать сущности скрипта A.js в проекте C.wsf. Если эти скрипты суть только объявления зависимых сущностей и не выполняют никаких других действий, кроме объявления, то порядок подключения неважен.

Пример:

A.js

function A()
{
    WScript.Echo('A() before');
    B();
    WScript.Echo('A() after');
};

.
B.js

function B()
{
    WScript.Echo('B()');
};

.
C.wsf

<?xml version="1.0" encoding="utf-8" ?>

<package>
<job id="wscmd">
<?job error="false" debug="false" ?>
<script language="javascript" src=".\A.js"></script>
<script language="javascript" src=".\B.js"></script>
<script language="javascript"><![CDATA[

WScript.Echo('main()');
A();
B();
WScript.Echo('main() again');

]]></script>
</job>
</package>

.
Результат

main()
A() before
B()
A() after
B()
main() again

.
Видно, что модуль A.js зависит от B.js, но его "объявление" раньше модуля B.js. Более того. Можно было бы описать некую функцию, в основном скрипте C.wsf и заменить все вызовы WScript.Echo на вызов этой функции и это тоже работало бы.

function alert(msg)
{
    WScript.Echo(msg);
};

.
Другое дело, если в файле A.js за пределами объявленных сущностей модуля выполняются некоторые действия с сущностями из модуля B.js. Тогда порядок важен. Возможно имеет смысл переписать файл A.js, так чтобы сохранить модульную зависимость от B.js, но действия выполнялись за пределами файла A.js.

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

13

Re: Использование при подключении WSC относительного пути

Вдогонку, отдельным постом.

Посмотрите на скрипт wscmd. Когда-то я его уже представлял здесь, но сделал это неубедительно. Сейчас этой темы уже нет, возможно она лежит в offline-архиве. По сути - это смешанный двуязычный скрипт, который генерирует временный WSF-файл в текущем каталоге, автоматически подключает все следующие файлы из каталога, который находится рядом со скриптом wscmd и запускает результирующий WSF-файл. По окончании выполнения временный файл удаляется.

js\*.js
js\win32\*.js
vbs\win32\*.js

Пример.
Пусть Ваши файлы лежат в следующем порядке

D:\scripts\wscmd.bat
D:\scripts\js\Network.js
D:\scripts\js\Utils\UniUtils.js
D:\project.js

Если путь к wscmd.bat прописан в переменной %PATH% то Вы можете запустить скрипт так:

wscmd project.js

Посмотрите, возможно это близко к Вашим запросам. А мне будет интересно получить отзыв о его работе. Скрипт обладает еще большими возможностями. Почитать на корявом английском можно здесь http://code.google.com/p/jsxt/wiki/wscmd.

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

14 (изменено: RUVATA, 2012-05-31 16:44:08)

Re: Использование при подключении WSC относительного пути

Rumata, Ваше решение довольно интересно, но оно не совсем удовлетворяет моими потребностям, если не сказать что совсем не удовлетворяет возможно для кого-то это будет очень полезным...
Но я таки изобрел свой "велосипед", уж не знаю пригодится кому ни будь или нет, но по мне так я буду пользоваться обязательно... создам как я отдельную тему по этому поводу -
http://forum.script-coding.com/viewtopi … 609#p60609

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.