Скрытие консоли без потери стандартных ошибок - PullRequest
2 голосов
/ 29 января 2009

Мой вопрос похож на Запуск CMD или BAT в бесшумном режиме , но с одним дополнительным ограничением.

Если вы используете WshScript.Run в vbscript, вы теряете доступ к стандартным входным / ошибочным / выходным потокам процесса. WshScript.Exec предоставляет вам доступ к стандартным потокам, но вы не можете скрыть свои окна. Как вы можете получить свой торт (спрятать окна) и съесть его (иметь прямой доступ к потокам консоли)?

В настоящее время я думаю о исполняемом файле C ++, который создает новую рабочую станцию ​​Windows и рабочий стол (см. MSDN ) и запускает указанный сценарий на этом новом рабочем столе (я еще не являюсь экспертом по Window Станции и десктопы, так что от этой идеи можно отказаться).

Эта идея основывается на функции Condor USE_VISIBLE_DESKTOP, которая, если она отключена, запускает задания Condor на невидимом рабочем столе. Я не совсем понял, требует ли это повышенных привилегий.

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

У кого-нибудь есть дополнительные идеи? Или отзывы о подходе, изложенном выше?

Редактировать:

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

Ответы [ 4 ]

1 голос
/ 04 февраля 2009

Мне не повезло с фрагментом VBScript выше - окна все равно будут всплывать. Однако я нашел инструмент под названием hstart , который выглядит примерно так, как мне нужно. К сожалению, он не является открытым исходным кодом или бесплатен для коммерческого использования.

1 голос
/ 04 февраля 2009

Cygwin (http://www.cygwin.com/) поставляется с утилитой run.exe, которая выполняет то, что вы запрашиваете для общего процесса. Вы можете использовать это, чтобы обернуть ваш вызов cscript. Cygwin - это GNU, поэтому он бесплатный для коммерческих или личных целей. использовать.

0 голосов
/ 04 марта 2013

Вы можете использовать Exec , бесплатный инструмент, который я написал, который обеспечивает интерфейс командной строки для вызова API-интерфейса Windows CreateProcess. Версия с графическим интерфейсом не имеет самой консоли, и вы можете использовать ее для запуска сценария оболочки (пакетного файла) в скрытом окне.

Bill

0 голосов
/ 29 января 2009

Я только немного проверил это, так что YMMV ...

Поместите следующий код в файл .vbs (я назвал мой HideWindow.vbs):

Const HIDDEN_WINDOW = 12

computer = "."
Set oWmiService = GetObject("winmgmts:" & _
                            "{impersonationLevel=impersonate}!\\" & _
                            computer & "\root\cimv2")
Set oStartup = oWmiService.Get("Win32_ProcessStartup")

Set oConfig = oStartup.SpawnInstance_
oConfig.ShowWindow = HIDDEN_WINDOW
Set oProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
ret = oProcess.Create("cmd.exe /c C:\Scripts\test.cmd", null, oConfig, pid)

Вызовите его из командного файла или командной строки следующим образом:

CSCRIPT HideWindow.vbs

Все, что вы введете в test.cmd, будет работать без отображения окна. Это может быть улучшено несколькими способами, но особенно путем параметризации программы, вызываемой oProcess.Create.

...