выполнение сценария Powershell из php

Я пытаюсь выполнить скрипт powershell из PHP, но он, похоже, не работает.

скрипт ' newEvent.ps1 ' создает событие на сервере Exchange.

$psPath = "powershell.exe";
$psDIR = "C:wampwwwantassetsps";
$psScript = "newEvent.ps1";
$runScript = $psDIR. $psScript;
$runCMD = $psPath." ".$runScript." 2>&1"; 

echo "$psPath  $psPath <br>";
echo "$psDIR  $psDIR <br>";
echo "$psScript  $psScript <br>";
echo "$runScript  $runScript <br>";
echo "$runCMD   $runCMD  <br>";

exec( $runCMD,$out,$ret);

echo "<pre>";
print_r($out);
print_r($ret);
echo "</pre>";

выдает:

$psPath powershell.exe
$psDIR C:wampwwwantassetsps
$psScript newEvent.ps1
$runScript C:wampwwwantassetspsnewEvent.ps1
$runCMD powershell.exe C:wampwwwantassetspsnewEvent.ps1 2>&1

Array
(
    [0] => File C:wampwwwantassetspsnewEvent.ps1 cannot be loaded because the execut
    [1] => ion of scripts is disabled on this system. Please see "get-help about_signing"
    [2] => for more details.
    [3] => At line:1 char:39
    [4] => + C:wampwwwantassetspsnewEvent.ps1 <<<<
    [5] =>     + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    [6] =>     + FullyQualifiedErrorId : RuntimeException
    [7] => 
)

если я powershell.exe C:wampwwwantassetspsnewEvent.ps1 в командной строке, она работает нормально.

это первый раз, когда я пытаюсь что-то подобное. Я побежал!--3--> но это все еще дает мне ту же ошибку. На самом деле я бежал Set-ExecutionPolicy unristricted, но это все то же самое.

3 ответов


похоже, что ваша команда окружена одинарными кавычками. Я думаю, если вы удалите их, ваша команда должна работать.

shell_exec возвращает выходные данные выполняемой команды. Для дальнейшей диагностики сохраните вывод в переменной, затем распечатайте его:

$output= shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '</pre>' );

убедитесь, что вы включили запуск сценариев. По умолчанию эта возможность отключена. Необходимо включить выполнение сценариев на каждой машине, на которой требуется запустить сценарии PowerShell. Запустить about help_signing дополнительные информация.

Microsoft рекомендует управлением Set-ExecutionPolicy RemoteSigned -Scope LocalMachine. Это позволяет всем учетным записям пользователей на компьютере запускать локальные сценарии без проблем, но требует подтверждения для запуска сценариев, загруженных из интернета. Это должно выполняться в административной строке. Если вы используете 64-разрядную операционную систему, вам нужно сделать это как из 64-разрядной, так и из 32-разрядной оболочки.


использовать "-executionPolicy Unrestricted" вместе с командой "powershell.exe". Поэтому команда будет:

powershell.exe -executionPolicy Unrestricted

тогда это, безусловно, работает.


нашел это на другом веб-сайте и подумал, что я передам его:

Я отлаживал программу, которая использует Windows API (создание ребенка Процесс C перенаправленным входом и выходом) для захвата stdout Майкрософт для Windows PowerShell для.

скрипт, переданный PowerShell (- File switch), не выполняется и PowerShell просто повесили, пока не убил Диспетчер задач.

оказывается, вам нужно использовать недокументированный параметр " - InputFormat нет":

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1

Это сделал трюк для меня.