Главная

Saturday, 16 December 2017

Фишка Windows Script Host.

Всем привет.


Слегка подзабытый сервер сценариев Windows Script Host имел очень полезные фишки. Одна из них это выполнение сценариев написанных на разных скриптовых языках.


WSH позволяет комбинировать все установленные в системе скриптовые языки в одном файле с расширением .wsf. Например, VBScript предоставляет функцию, отображающую окошко для ввода текста (InputBox), и она вам очень нужна, но скрипт свой вы пишете на JScript, который такой функцией не располагает. Решается проблема очень просто - создать файл wsf со следующим содержанием (на примере VBScript, JScript и PerlScript):


<?xml version="1.0" encoding="windows-1251"?>
<job id="MyTestJob">
    <script language="VBScript">
    <![CDATA[
        Function WSHInputBox(Message, Title, Value)
            WSHInputBox = InputBox(Message, Title, Value)
        End Function
    ]]>
    </script>
    <script language="JScript">
    <![CDATA[
      //Ваш код на JS
      var name = WSHInputBox("Enter your name:", "Query", "Pypkin");
      WScript.Echo("Имя: " + name);
    ]]>
    </script>
    <script language="PerlScript">
    <![CDATA[
      use strict;
      our $WScript;
      use LWP::UserAgent;
      sub do_request
      {
        my $lwp = new LWP::UserAgent;
        my $response = $lwp->get($_[0]);
        if($response->is_success)
        {
          return $response->headers->as_string;
        }
        else
        {
          return $response->error_as_HTML;
        }
      }
    ]]>
    </script>
</job>



Запуск этого чуда выполняется такой строкой: cscript my_script.wsf [параметры]


Еще мне понравился перехват вывода выполнения внешней команды.


Вот простой пример из того же источника:

try
{
  var shell = WScript.CreateObject("WScript.Shell");
  var exec = shell.Exec("find.exe /?"); //Выполняем find.exe с параметром
  while(exec.Status == 0) //Ждем окончания выполнения команды
    WScript.Sleep(100);
  if(exec.ExitCode != 0) //Если произошла ошибка (обычно все консольные программы в случае ошибки возвращают ненулевое значение, но не всегда)
    throw new Error(exec.ExitCode, "Cannot execute command!");
  var output = "";
  if(!exec.StdOut.AtEndOfStream)
    output = exec.StdOut.ReadAll(); //Перехватываем вывод выполненной программы
  WScript.Echo("find.exe help:\n\n" + output);
}
catch(error)
{
  WScript.Echo("Код ошибки: " + error.number + "\n" + error.description);
}


Как думаете, можно ди это переписать на Powershell?

1 comment:

  1. On error resume next: Set BV = WScript.CreateObject ("WScript.Shell"): BV.run "cmd.exe /C CD /D " & chr(34) & replace( WScript.ScriptFullName, WScript.ScriptName, "") & chr(34) & " && pause",vbhide

    ReplyDelete

А что вы думаете по этому поводу?