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