как запустить командный файл или команду в текущем окне командной строки 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).