Чтение Труба из cmd.exe, который использует встроенный "start" - PullRequest
0 голосов
/ 23 февраля 2011

Я пытаюсь «оставить сообщение» для текущего пользователя (в Windows) с помощью WScript.exe, не дожидаясь, пока пользователь подтвердит сообщение.

Я думал создать новый процесс, используя встроенную функцию «запуск» (она обычно открывает новое окно и элемент управления возвращается к вызывающей стороне) и вызывать WScript с помощью короткого сценария, чтобы открыть окно сообщения на экране, а затем выход.

Это работает нормально, если я не попытаюсь открыть канал из этого скрипта (и прочитать его). Если я попытаюсь выполнить чтение из канала, считывающий ввод-вывод никогда не получит EOF, пока не завершится wscript.exe, даже если эта программа продолжит выполнение после команды «start».

Вот пример:

test.vbs

WScript.Echo "Hello World!"

invoke.cmd

start wscript.exe //nologo test.vbs
@echo Exiting...
exit /b

Если я запускаю invoke.cmd в командной строке, открывается окно WScript и элемент управления возвращается к приглашению.

Однако, если я попытаюсь направить вывод в команду (которая пытается прочитать канал), подкоманда никогда не увидит, что канал закрыт до тех пор, пока wscript.exe не завершится.

Однако это поведение не требует WScript.exe. Похоже, что так вести себя, пока процесс, созданный командой «start», все еще работает. Я могу получить то же поведение с "cmd.exe /k".

invoke2.cmd

start cmd /k date /t
@echo Exiting...
exit /b

Попытка чтения из канала из блоков invoke2.cmd до тех пор, пока не завершится процесс "start".

Я не вижу аргументов командной строки для «запуска», которые утверждают, что управляют поведением, подобным этому, и я не очень понимаю, почему cmd.exe, использующий «запуск» для создания новых процессов / окон выиграл » t выход до выхода из окна «Пуск».

Как ни странно, все работает, если я перенаправлю вывод в файл. Это просто не работает с трубой.

Есть идеи?

1 Ответ

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

Поскольку вы используете wscript.exe, в вашей команде Echo появляется окно с сообщением. Попробуйте запустить

start cscript.exe //nologo test.vbs

cscript.exe - версия командной строки, поэтому она будет выводиться в командной строке.

...