1 (изменено: Camarada, 2011-08-31 15:53:34)

Тема: JScript: Включение одного файла в другой

Знаете поискал, нашел только с помощью чтения файла и вызова eval.
Однако, я хочу подключать определения и тут сталкиваюсь с такой проблемой.

test.js

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

main.js

include_file("test.js");


var fso = null;
function get_fso(){
        if (fso == null)
               fso = new ActiveXObject("Scripting.FileSystemObject");
        return fso;
}

function include_file(file_path){
    var fs = get_fso();
    var file = fs.OpenTextFile(file_path);
    str = file.ReadAll();
    file.Close();
    eval(str);
}


echo("fuck");//Error "Предполагается наличие объекта"

Вот так

function include_file(file_path){
    var fs = get_fso();
    var file = fs.OpenTextFile(file_path);
    str = file.ReadAll();
    file.Close();
    eval(str);
    echo("fuck");
}

echo работает. Т.е. имеем проблемы с областью видимости. Есть ли путь решения? Второй день занимаюсь JS, не пинайте пожалуйста.

2

Re: JScript: Включение одного файла в другой

Execute
http://msdn.microsoft.com/en-us/library … S.85).aspx

ExecuteGlobal
http://msdn.microsoft.com/en-us/library … s.85).aspx

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: JScript: Включение одного файла в другой

Если основной файл сохранять в виде WSF файла, а не JS, то можно делать так:

<job>
  <script language="JScript" src="test.js"/>
  <script language="JScript">
    echo("fuck");
  </script>
</job>

4

Re: JScript: Включение одного файла в другой

Спасибо за ответ, мой вопрос был про JScript, как я понял, statements Execute и ExecuteGlobal поддерживаются VBScript.


По поводу второго варианта, спасибо, мне не очень нравится решение, но попробовать может.
Не нравится наверное потому, что не знаю, что такое job.

5

Re: JScript: Включение одного файла в другой

В итоге думаю раскидать код по отдельным js, а в wsf-файле вызвать функцию Main(), что-то вроде этого.

6

Re: JScript: Включение одного файла в другой

Вот здесь описан формат WSF файлов: http://msdn.microsoft.com/en-us/library … 85%29.aspx
<job></job> - в данном случае это просто оболочка, чтобы можно было написать несколько тегов <script></script> подряд.

7

Re: JScript: Включение одного файла в другой

Spy00000 пишет:

Вот здесь описан формат WSF файлов: http://msdn.microsoft.com/en-us/library … 85%29.aspx
<job></job> - в данном случае это просто оболочка, чтобы можно было написать несколько тегов <script></script> подряд.

Благодарю, этот вариант вполне устроит. WSC долго и требует регистрации компонента, поэтому я от этого отказался.

8

Re: JScript: Включение одного файла в другой

Camarada пишет:

WSC долго и требует регистрации компонента, поэтому я от этого отказался.

Если использовать моникер «script:» — не требует.

9 (изменено: XGuest, 2012-05-10 20:37:09)

Re: JScript: Включение одного файла в другой


//в test.js написать
var echo = function(msg){WScript.Echo(msg);}

Для VB


'* CScript.cmd
'* copy CScript.vbs %SystemRoot%\System32\CScript.vbs

'* CScript.reg
'; REGEDIT4
'; 
'; [HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command]
'; @="%SystemRoot%\\System32\\CScript.exe %SystemRoot%\\System32\\CScript.vbs ""%1"" %*"

'* CScript.vbs 
OPTION EXPLICIT
Dim Str, Args, i:Str = "5075626C69632046756E6374696F6E20496E636C756465202846696C654E616D65293A"&_
"57697468204372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A656374222"&_
"90D0A4946204E6F74202E46696C654578697374732846696C654E616D6529205468656E3A575363726970742E4563"&_
"686F202294A0A9AB20ADA520ADA0A9A4A5AD3A20222646696C654E616D653A496E636C7564653D323A57536372697"&_
"0742E517569740D0A496E636C7564653D2E47657446696C652846696C654E616D65292E4F70656E41735465787453"&_
"747265616D2831292E52656164416C6C3A4F4E204552524F5220524553554D45204E4558543A45786563757465476"&_
"C6F62616C28496E636C756465290D0A4966204572722E4E756D626572205468656E3A4572722E436C6561723A4361"&_
"6C6C20436865636B4572722846696C654E616D652C20496E636C756465293A4F4E204552524F5220474F544F20300"&_
"D0A456E6420576974683A456E642046756E6374696F6E3A46756E6374696F6E20436865636B4572722846696C654E"&_
"616D652C20436F6465293A57697468204372656174654F626A65637428224D53536372697074436F6E74726F6C2E5"&_
"36372697074436F6E74726F6C22290D0A2E4C616E67756167653D225642536372697074223A2E6164646F626A6563"&_
"74202257536372697074222C575363726970743A4F4E204552524F5220524553554D45204E4558543A2E616464636"&_
"F646528436F6465290D0A575363726970742E4563686F20228EA1E0A0A1AEE2AAA820E4A0A9ABA020222646696C65"&_
"4E616D6526222822262E4572726F722E4C696E6526222C2022262E4572726F722E436F6C756D6E202B20312026222"&_
"92226766243724C66265F0D0A2E4572726F722E536F7572636526223A2022262E4572726F722E4465736372697074"&_
"696F6E3A436865636B4572723D4572722E4E756D6265723A4572722E436C6561723A4F4E204552524F5220474F544"&_
"F20300D0A575363726970742E5175697420436865636B4572723A456E6420576974683A456E642046756E6374696F6E"
With WScript.Arguments
 If .Count > 1 Then
  For i  = 1 to .Count -1
   Args    = Args & " " & .Item(i)                   ' Собрать аргументы в строку
  Next
 End If
End With
'* Сохранить копию, дописать к файлу функцию Include, выполнить скрипт и востановить его
SwapExec WScript.Arguments(0), Args, Str_Hex(Str, "dec")'* сохранненную копию

Function SwapExec(FileName, Args ,Str)
Dim FSO, TempName, Stream
 Set FSO    = CreateObject("Scripting.FileSystemObject")' Объявить объект
 TempName   = FSO.GetTempName                        ' Имя файла временной копии
 FSO.CopyFile FileName, TempName, 0                  ' Создать временную копию
 Set Stream = FSO.OpenTextFile(FileName,8,0)         ' Открыть файл для дозаписи   
 Stream.WriteLine                                    ' Добавить пустую строку
 Stream.WriteLine Str                                ' Добавить фрагмент к файлу
 Stream.Close                                        ' Закрыть файл
 ScriptExec FileName, Args                           ' Выполнить файл
 FSO.DeleteFile FileName, 0                          ' Удалить файл
 FSO.MoveFile TempName, FileName                     ' Востановить файл из копии
 Set Stream = Nothing                                ' Разрушить объект Stream
 Set FSO    = Nothing                                ' Разрушить объект FSO
End Function

Function Str_Hex(Str, Val)                           ' Если ключь "enc" преобразовываем строку
 If Val    = "enc" Then                              ' в ее HEX значение
  For Val  = 1 To Len(str)                           ' Читать строку с первого до последнего символа
   Str_Hex = Str_Hex & Right("0" & Hex(Asc(Mid(Str, Val, 1))), 2) ' Преобразование в HEX значение
  Next
 Else                                                ' иначе наоборот HEX значение в строку
  For Val  = 1 To Len(str) step 2                    ' Читать строку с первого до последнего символа
   Str_Hex = Str_Hex & Chr("&H" & Mid(str, Val, 2))  ' Преобразование в строку
  Next
 End if
End Function

Function ScriptExec(FileName, Args)
 With CreateObject("WScript.Shell").Exec("cscript.exe /nologo " & Chr(34) & FileName & Chr(34) & Args)' Выполнить комманду
  With .StdOut                                       ' Читать стандартный поток вывода
   While Not .AtEndOfStream                          '  до конца потока "EndOfStream"
    Wscript.Echo Str_ReCode(.ReadLine, "cp866", "windows-1251")' Передать перекодированный вывод на экран
   Wend
  End With
  With .StdErr                                       ' Читать поток вывода ошибок
   While Not .AtEndOfStream                          '  до конца потока "EndOfStream"
    Wscript.Echo Str_ReCode(.ReadLine, "cp866", "windows-1251")' Передать перекодированный вывод на экран
   Wend
  End With
 End With
End Function

Function Str_ReCode(InpStr, InpCode, OutCode)
 IF InpCode = "" Then Str_ReCode=InpStr:Exit Function' Если кодировка входящей не указанна выйти
 IF OutCode = "" Then OutCode = "windows-1251"       ' Кодировка исходящей строки по умолчанию
 With CreateObject("ADODB.Stream")                   ' Объявить объект ADODB
     .Charset   = OutCode                            ' Указать кодировку исходящей строки
     .Open                                           ' Открыть поток
     .Writetext InpStr                               ' Записать входящую строку
     .position  = 0                                  ' Перевести указатель на начало
     .Charset   = InpCode                            ' Указать кодировку входящей строки
     Str_ReCode = .readText                          ' Прочитать исходящую строку
 End With
End Function
'* End of file