Почему этот VBScript дает мне ошибку?

Я сохранил этот VBScript script на моем локальном компьютере как c:\test.vbs:

WScript.StdOut.WriteLine "This is a test"

Когда я запускаю его из командной строки, я получаю эту ошибку:

---------------------------
Windows Script Host
---------------------------
Script: C:\test.vbs
Line:   1
Char:   1
Error:  The handle is invalid. 
Code:   80070006
Source:     (null)

---------------------------
OK   
---------------------------

Я получаю это под Windows Vista (SP1) и Windows XP Pro (SP3).

Ответы

Ответ 1

Эта ссылка может вам помочь:

http://www.tech-archive.net/Archive/Scripting/microsoft.public.scripting.vbscript/2004-07/0979.html

Похоже, что дескриптор StdOut доступен только при использовании хоста консоли (cscript.exe), а не в оконном хосте (wscript.exe). Если вы хотите, чтобы код работал, вы должны использовать cscript.exe для его запуска.

Сообщение также описывает, как изменить поведение по умолчанию для запуска скриптов с помощью cscript, а не wscript.

Ответ 2

Как описано в принятом ответе, мой script работал, когда я вызывал его из командной строки следующим образом:

cscript test.vbs

Вы также можете изменить хост по умолчанию script, так что вызов cscript не требуется каждый раз. После этого исходная команда работает без изменений.

cscript //h:cscript //s 

Восстановить исходное поведение можно с помощью:

cscript //h:wscript //s 

Спасибо!!

Ответ 3

Я отправил это решение в сообщение об ошибке cscript - вывод на печать в той же строке на консоли?, который, как мне кажется, связан с этой проблемой.

Я использую следующую функцию "log" в своем JavaScript для поддержки среды wscript или cscript. Как вы можете видеть, эта функция будет записывать на стандартный вывод, только если это возможно.

var ExampleApp = {
    // Log output to console if available.
    //      NOTE: Script file has to be executed using "cscript.exe" for this to work.
    log: function (text) {
        try {
            // Test if stdout is working.
            WScript.stdout.WriteLine(text);
            // stdout is working, reset this function to always output to stdout.
            this.log = function (text) { WScript.stdout.WriteLine(text); };
        } catch (er) {
            // stdout is not working, reset this function to do nothing.
            this.log = function () { };
        }
    },
    Main: function () {
        this.log("Hello world.");
        this.log("Life is good.");
    }
};

ExampleApp.Main();