выполнение сценария 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 , но он все тот же.

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

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 (создание дочернего процесса с перенаправленными вводами и выводами) для захвата stdout Microsoft Windows PowerShell.

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

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

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

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