Команда PHP Powershell

Попытка запустить следующую команду в php для запуска команды powershell...

следующие работы:

$output = shell_exec(escapeshellcmd('powershell get-service | group-object'));

Я не могу запустить его так:

$output = shell_exec('powershell get-service | group-object');

не пройдет трубу | персонаж

но если я попытаюсь бежать:

$output = shell_exec(escapeshellcmd('powershell get-service | where-object {$_.status -eq "Running"}'));

Я не получаю выходной.

Следующие:

$cmd = escapeshellcmd('powershell get-service | where-object {$_.status -eq "Running"}');

возвращает:

powershell get-service ^| where-object ^{^$_.status -eq ^"Running^"^}

Любые предложения о том, почему это происходит и как это исправить?

Изменить: Также я мог бы запустить его как скрипт.ps1, но я хочу иметь возможность передать ему $var.

2 ответа

Решение

Я возьму удар, хотя у меня нет никакого опыта PHP вообще.

У меня такое ощущение, что происходит то, что ваш характер канала интерпретируется командной оболочкой вместо PowerShell. Например, если вы запустили в командной строке cmd.exe следующее:

dir /s | more

Выход первой команды передается на вход второй точно так же, как и в PowerShell.

Экранирование строки только усугубит проблему, потому что вы трансформируете строку таким образом, что PowerShell не знает, как ее удалить.

Попробуйте заключить оригинальное выражение PowerShell в кавычку, как показано ниже:

$output = shell_exec('powershell.exe -c "get-service | group-object"');

Или, предпочтительно, похоже, что есть функция exec(), которая не проходит через командную оболочку. Это может работать лучше.

$output = exec('powershell.exe -c get-service | group-object');
'powershell get-service | group-object'

будет интерпретироваться как

  1. запустить powershell и передать его в качестве аргумента get-service
  2. затем направьте вывод powershell в group_object (то есть, не вывод get-service)

То, что вы хотите, это видеть PowerShell get-service | group-object как аргумент, вы должны заключить это в кавычки, вот так.

 $output = shell_exec('powershell "get-service | group-object"');
Другие вопросы по тегам