В vbscript, как запустить командный файл или команду в среде текущего окна приглашения cmd? - PullRequest
1 голос
/ 19 сентября 2010

В VBScript, как запустить командный файл или команду, в текущем окне командной строки,

без запуска нового процесса.

Например. Согласно script56.chm (видимо, справка vbscript) Windows Script Host
Метод запуска (Windows Script Host)
«Запускает программу в новом процессе»

Так что, если у меня есть код, который использует это, например VBS-файл и BAT-файл. Переменная окружения g имеет значение abc g = abc из этого командного окна, В VBS-файле вызывается BAT-файл с хостом сценариев Windows Run. Процесс летучей мыши устанавливает g = z. и заканчивается .. и процесс VBS заканчивается. Переменная окружения остается нетронутой как g = abc.

Я знаю CreateObject ("Wscript.Shell"). Выполнить "c: \ test.bat", 0 запускает новое окно, как ясно при использовании 1 вместо 0. (так как 0 скрывает окно)

Как мне - запустить файл bat из vbs в той же среде cmd, в которую был вызван vbs, чтобы изменения повлияли на среду cmd, в которую он был вызван? - В случае двух окон, которым в данный момент является этот, как мне получить доступ к среде родительского окна cmd из командного файла?

1 Ответ

2 голосов
/ 21 сентября 2010

как запустить командный файл или команду в текущем окне командной строки cmd, не запуская новый процесс?

Я не думаю, что ты можешь; Ваш vbscript работает под управлением хоста скриптов (например, cscript.exe или wscript.exe), а командные файлы интерпретируются интерпретатором команд (обычно cmd.exe). Оба являются отдельными исполняемыми файлами, и ни один из них, насколько мне известно, не доступен как библиотека в процессе, поэтому вы не можете интерпретировать файлы .vbs и .cmd в одном и том же процессе. Я также очень сомневаюсь, что механизм хоста сценария, на котором работает ваш VBScript, также может запустить пакетный файл в его родительском cmd.exe - я не думаю, что вы можете «внедрить» новый пакетный файл в запущенный cmd.exe.

как получить доступ к среде родительского окна cmd из командного файла?

Не просто доступ, а изменение - «Изменение переменных среды» в MSDN совершенно точно говорит об этом: «Изменение переменных среды дочернего процесса во время создания процесса - единственный способ, которым один процесс может напрямую изменить переменные среды другого процесса. Процесс никогда не может напрямую изменять переменные среды другого процесса, который не является дочерним для этого процесса. " Вы пытаетесь изменить среду родительского не ребенок, процесс. (Хотя мне интересно, что означает «непосредственно» в контексте этой цитаты).

Я бы предположил, что причиной этого является безопасность; представьте себе хаос, который может быть нанесен, если произвольные процессы могут (злонамеренно или случайно) изменить переменную среды PATH (или COMSPEC) запущенного процесса, такого как процесс вашего хост-движка vbscript, - он может полностью не запустить ваш файл bat, нарушая ваш программа.

Казалось бы, вам не повезло - однако есть много других механизмов для передачи информации между процессами. Вот пара предложений, которые довольно просто реализовать при разговоре между командным файлом и vbscript, хотя это ни в коем случае не является исчерпывающим:

  • Коды выхода
  • Запись и анализ выходных данных консоли (stdout) или временного файла

Если вам абсолютно нужно для установки переменных окружения в родительском cmd.exe (а также абсолютно требуется промежуточный шаг vbscript), то вам, возможно, придется написать оболочку пакетный файл, который запускает VBScript, использует информацию, произведенную им, а затем устанавливает переменные среды; Так как командный упаковщик выполняет в процессе cmd верхнего уровня, он сможет изменить env vars там.

Сноска. Обратите внимание, что вы можете изменить постоянные системные / пользовательские переменные среды (в отличие от переменных среды процесса) из VBScript, но я бы не рекомендовал это, если вы пытаетесь создать переходное состояние; кроме того, это никак не повлияет на уже запущенные процессы (например, родительский cmd.exe).

...