Попытка запустить следующую команду в 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^"^}
Любые предложения о том, почему это происходит и как это исправить?
Edit: Также я мог бы запустить его как скрипт .ps1, но я хочу иметь возможность передать $ var.
Я возьму укол, хотя у меня нет опыта 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'
будет интерпретироваться как
Что вы хотите, так это для powershell, чтобы увидеть get-service | group-object
get-service | group-object
качестве аргумента, поэтому вам нужно заключить это в кавычки, например.
$output = shell_exec('powershell "get-service | group-object"');