Принудительно запустить VBS, используя cscript вместо wscript - PullRequest
17 голосов
/ 14 января 2011

Что такое одобренный (и, следовательно, правильный) метод stackoverflow для принудительного запуска VBS с использованием cscript вместо wscript - независимо от того, что пытается пользователь?

Быстрый поиск в Google показывает множество примеров, но некоторыеиз них просто не работают, а те, которые часто не обрабатывают тот факт, что он может быть запущен с аргументами, поэтому я стремлюсь узнать, как лучше всего.

Вот один пример, которыйне обрабатывает аргументы:

sExecutable = LCase(Mid(Wscript.FullName, InstrRev(Wscript.FullName,"\")+1))
If sExecutable <> "cscript.exe" Then
  Set oShell = CreateObject("wscript.shell")
  oShell.Run "cscript.exe """ & Wscript.ScriptFullName & """"
  Wscript.Quit
End If

Я ценю, что это, вероятно, можно легко изменить для обработки аргументов, но понимаю, что это может быть не лучшим способом решения проблемы.

Справочная информацияЯ пишу сценарий, который можно запустить двойным щелчком или (наиболее вероятно) из пакетного файла DOS или в виде запланированной задачи.Он может содержать один или несколько необязательных аргументов командной строки.

Ответы [ 5 ]

22 голосов
/ 07 марта 2011

Господи, какой неиспорченный мусор.Это заставляет меня плакать, чтобы увидеть такое грубое кодирование (без обид, никому).Серьезно, однако, вот мои 2 пенса:

Sub forceCScriptExecution
    Dim Arg, Str
    If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
        For Each Arg In WScript.Arguments
            If InStr( Arg, " " ) Then Arg = """" & Arg & """"
            Str = Str & " " & Arg
        Next
        CreateObject( "WScript.Shell" ).Run _
            "cscript //nologo """ & _
            WScript.ScriptFullName & _
            """ " & Str
        WScript.Quit
    End If
End Sub
forceCScriptExecution

Он обрабатывает аргументы И проверяет пробелы в указанных аргументах - так что в случае имени файла, передаваемого исходному экземпляру скрипта, содержащему пробелы, онне будет "токенизирован" при передаче в cscript.exe.

Единственное, что он не делает, это проверяет на StdIn (например, в случае, когда кто-то передает что-то в скрипт через командную строку, нозабыл использовать "cscript script.vbs") - но если он был выполнен WScript.exe, все методы WScript.StdIn возвращают ошибки Invalid Handle, так что в любом случае проверить это невозможно.

Не стесняйтесьдайте мне знать, если есть способ «сломать» это;Я готов улучшить его в случае необходимости.

4 голосов
/ 25 сентября 2015

Два небольших дополнения к forceCScriptExecution позволяют мне видеть его окно после завершения и обрабатывать его код возврата.

Sub forceCScriptExecution
    Dim Arg, Str
    If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
        For Each Arg In WScript.Arguments
            If InStr( Arg, " " ) Then Arg = """" & Arg & """"
            Str = Str & " " & Arg
        Next
        **ret =** CreateObject( "WScript.Shell" ).Run **("cmd /k** cscript //nologo """ & WScript.ScriptFullName & """ " & Str**,1,true)**
        WScript.Quit **ret**
    End If
End Sub

Примечания: «cmd / k» позволяет окнам оставаться после выполнения.Параметр «1» активирует окно.Параметр «true» ожидает завершения, поэтому переменная «ret» может вернуть код ошибки.

3 голосов
/ 08 января 2013

Вот аналогичный пример в JScript для запуска файлов .js в CScript:

(function(ws) {
  if (ws.fullName.slice(-12).toLowerCase() !== '\\cscript.exe') {
    var cmd = 'cscript.exe //nologo "' + ws.scriptFullName + '"';
    var args = ws.arguments;
    for (var i = 0, len = args.length; i < len; i++) {
      var arg = args(i);
      cmd += ' ' + (~arg.indexOf(' ') ? '"' + arg + '"' : arg);
    }
    new ActiveXObject('WScript.Shell').run(cmd);
    ws.quit();
  }
})(WScript);

WScript.echo('We are now in CScript. Press Enter to Quit...');
WScript.stdIn.readLine();

https://gist.github.com/4482361

1 голос
/ 15 января 2011

Одним из подходов может быть предоставление ему другого расширения вместо .vbs.Скажем .cvbs например.Свяжите .cvbs с cscript.exe, а не с wscript.exe, поэтому выполнение или двойной щелчок по файлу .cvbs никогда не вызовет wscript.exe.

0 голосов
/ 05 июня 2016

Вот мой фрагмент кода, который я использую для некоторых своих скриптов. Он также обрабатывает аргументы .Все, что вам нужно сделать, это заменить {EnterWorC} на «w» или «c» С кавычками

Dim WorC, Command, Arguments, I

WorC={EnterWOrC}  'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER.

WorC=LCase (WorC)
If lcase (WorC)="w" Or lcase (WorC)="c" Then

If LCase (Right (WScript.FullName,11))<> WorC & "script.exe" Then
    command=WScript.ScriptFullName
    Arguments=""
    For I=0 To UBound (WScript.Arguments)
        Arguments=Arguments & Chr (34) & WScript.Arguments(I) & Chr (34) & Space (1)
    Next
    CreateObject("Wscript.Shell").Run WorC & "script.exe " & Chr (34) & command & Chr (34) & Space (1) & Arguments, 1
    WScript.Quit
End If
    WorC=Empty
    Command=Empty
    I=Empty
    Arguments=Empty
End If

Здесь вам придется заменить 2-ю строку (2-й НЕТ-белая линия)

WorC={EnterWOrC}  'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER.

Для Wscript: WorC="W"

Для CScript: WorC="C"

НЕ учитывает регистр.

...