ejecutar un script de Powershell desde php

Estoy intentando ejecutar un script de powershell desde PHP, pero parece que no funciona.

El script ‘newEvent.ps1’ crea un evento en el servidor de 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 
"; echo "\$psDIR $psDIR
"; echo "\$psScript $psScript
"; echo "\$runScript $runScript
"; echo "\$runCMD $runCMD
"; exec( $runCMD,$out,$ret); echo "
"; print_r($out); print_r($ret); echo "

";

Emite:

 $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 <<< + CategoryInfo : NotSpecified: (:) [], PSSecurityException [6] => + FullyQualifiedErrorId : RuntimeException [7] => ) 

Si ejecuto powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 en la línea de comandos, funciona bien.

Esta es la primera vez que bash algo como esto. Set-ExecutionPolicy RemoteSigned -Scope LocalMachine pero todavía me da el mismo error. De hecho, ejecuté Set-ExecutionPolicy unristricted , pero sigue siendo el mismo.

Parece que su comando está rodeado por comillas simples. Creo que si los eliminas, tu comando debería ejecutarse.

shell_exec devuelve el resultado del comando que ejecuta. Para diagnosticar aún más, almacene el resultado en una variable y luego imprímalo:

 $output= shell_exec($runCMD); echo( '
' ); echo( $output ); echo( '

' );

Asegúrese de habilitar las secuencias de comandos en ejecución. Esa capacidad está desactivada por defecto. Debe habilitar la ejecución de scripts en cada máquina en la que desee ejecutar los scripts de PowerShell. Ejecute about help_signing para obtener más información.

Microsoft recomienda ejecutar Set-ExecutionPolicy RemoteSigned -Scope LocalMachine . Esto permite que todas las cuentas de usuario en una máquina ejecuten scripts locales sin problemas, pero requiere confirmación para ejecutar scripts descargados de Internet. Esto debe ejecutarse en un aviso administrativo. Si está ejecutando un sistema operativo de 64 bits, tendrá que hacer esto desde un shell de 64 bits y 32 bits.

Use ” -executionPolicy Unrestricted ” junto con el comando ” powershell.exe “. Por lo tanto, el comando será:

 powershell.exe -executionPolicy Unrestricted 

Entonces seguramente funcionará.

Encontré esto en otro sitio web y pensé que podría pasarlo:

Estaba depurando un progtwig que usa la API de Windows (Creación de un proceso secundario con entradas y salidas redirigidas) para capturar la salida estándar de Windows PowerShell de Microsoft.

El script pasado a PowerShell (-Interruptor de archivos) no se ejecutó y PowerShell simplemente se colgó hasta que el Administrador de tareas lo mató.

Resulta que debe usar el parámetro no documentado “-InputFormat none”:

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

Esto hizo el truco para mí.