Powershell неожиданно открывает cmd.exe для выполнения бит - PullRequest
4 голосов
/ 18 ноября 2011

До вчерашнего дня, когда я выполнял скрипт внутри powershell, используя либо

"foo.bat"

или

"cmd /c commandhere"

Он будет запускать команду внутри Powershell, а также печатать вывод. Теперь, так как сегодня он больше не находит «cmd», и при использовании «cmd.exe» или выполнении сценария bat он открывает окно cmd вместо запуска сценария в powershell.

Кто-нибудь знает, настраивается ли это или как я могу вернуться к выполнению сценариев прямо внутри powershell?

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

PS C:\> echo $env:Path
C:\Windows\system32;C:\Windows\;C:\Windows\System32\Wbem;C:\Windows\system32\WindowsPowerShell\v1.0\;C:\xampp\php;C:\code\azure\bin;%SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Windows\System32

Ответы [ 3 ]

0 голосов
/ 18 февраля 2013

Переменная среды PATHEXT определяет, какие файлы считаются «исполняемыми» и, таким образом, отображаются встроенными в вывод консоли.Напечатайте значение $env:pathext и убедитесь, что туда включен .BAT.

Если .BAT не указан, вы можете добавить его обратно, используя следующие команды в Powershell:

$pathext = [Environment]::GetEnvironmentVariable("PATHEXT", "Machine")
[Environment]::SetEnvironmentVariable("PATHEXT", $pathext+';.BAT', "Machine")

Это должно привести к тому, что .bat-файлы будут отображать встроенный вывод в консоли Powershell.Чтобы это вступило в силу, вам нужно либо перезапустить Powershell, либо добавить .BAT к собственной копии процесса PATERSEX переменной Powershell:

$env:pathext = "$env:pathext;.BAT"
0 голосов
/ 15 августа 2013

Чтобы добавить к ответу Джастина, "Машина" не может быть целью, которую вы ищете здесь, несмотря на то, что фрагмент кода работает.

Прежде всего, если PATHEXT не содержит ".BAT "или" .CMD "больше, проблема в другом месте.

Если это правильное поведение в вашей среде, тогда читайте дальше.

$pathext = [Environment]::GetEnvironmentVariable("PATHEXT", "Process")
[Environment]::SetEnvironmentVariable("PATHEXT", $pathext+';.BAT', "Process")
  • " Машина ""target помещает переменную в реестр" HKEY_LOCAL_MACHINE ", готовый для следующих процессов для чтения
  • Цель" User "помещает переменную в реестр" HKEY_CURRENT_USER ", готов чтобы следующие процессы читали
  • Цель "Процесс" прямо сейчас переводит переменную в работоспособное состояние для запущенного в данный момент процесса PowerShell.exe

Когда я говорю "process ", я действительно имею в виду какой-то другой исполняемый файл, запускаемый другими способами, кроме вашего скрипта.Процессы, запускаемые вашим сценарием (как ваша команда bat / cmd), являются дочерними процессами и наследуют текущую среду, то есть все определенные переменные, если вы не укажете это иначе, как второй поток «start-process».

Насколько я могу прочитать, это то, что вы пытаетесь достичь.переменная PATHEXT с новым добавленным содержимым будет работать только через сценарий / процесс PowerShell и будет доступна для вашего сценария bat / cmd.

0 голосов
/ 01 апреля 2012

Использовать invoke-выражение

http://technet.microsoft.com/en-us/library/dd347550.aspx

Я думаю, что-то вроде этого

invoke-expression -command "c:\batfile.bat"

или еще лучше, чтобы получить результаты на практике

$results = invoke-expression -command "c:\batfile.bat"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...