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


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

Сценарий 'newevent.ps1' создает событие на сервере Exchange.

$psPath = "powershell.exe";
$psDIR = "C:\\wamp\\www\\ant\\assets\\ps\\";
$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:\wamp\www\ant\assets\ps\
$psScript newEvent.ps1
$runScript C:\wamp\www\ant\assets\ps\newEvent.ps1
$runCMD powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 2>&1

Array
(
    [0] => File C:\wamp\www\ant\assets\ps\newEvent.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:\wamp\www\ant\assets\ps\newEvent.ps1 <<<<
    [5] =>     + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    [6] =>     + FullyQualifiedErrorId : RuntimeException
    [7] => 
)

Если я запускаю powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 в командной строке, он работает нормально.

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

Author: Gilles, 2011-03-15

3 answers

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

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

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

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

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

 8
Author: Aaron Jensen, 2014-07-21 17:43:59

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

powershell.exe -executionPolicy Unrestricted

Тогда это наверняка сработает.

 2
Author: Shobin Markose, 2012-03-20 12:12:20

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

Я отлаживал программу, использующую Windows API (создание дочернего Процесс с перенаправленным вводом и выводом) для захвата стандартного вывода Microsoft Windows PowerShell.

Сценарий, переданный в PowerShell (-Переключатель файлов), не выполнялся, и PowerShell просто зависал, пока не был убит диспетчером задач.

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

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

Это помогло мне.

 1
Author: Philip, 2012-01-09 21:55:09