выполнение сценария 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
Это сделал трюк для меня.