2011-03-15 128 views
9

Estoy tratando de ejecutar un script de powershell desde PHP, pero parece que no funciona.ejecutando un script de Powershell desde php

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 <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>"; 

Genera:

$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] => 
) 

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

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

+0

mira la línea de comandos que estás ejecutando. –

+0

Asegúrese de entrar en las instancias de 32 bits y de 64 bits y configure la política de ejecución, luego vuelva a intentarlo.-> Set-ExecutionPolicy Sin restricciones –

Respuesta

8

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

shell_exec devuelve la salida del comando que ejecuta. Para diagnosticar, almacenar el resultado en una variable, luego imprimirlo:

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

asegúrese de habilitar los scripts 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 de 32 bits.

+0

cansado en ambos sentidos, sin suerte. – heshanh

+0

Acabo de actualizar mi respuesta para reflejar su adición del mensaje de error que está recibiendo. –

+1

bien lo resolvió http://stackoverflow.com/questions/4647429/powershell-on-windows-7-set-executionpolicy-for-regular-users necesito ejecutarlo en las consolas x86 y 64 bit que estaba solo lo hago en la consola de 64 bits. – heshanh

0

encontrado esto en otro sitio web y pensé que iba a pasar a lo largo:

que fue depurando un programa que utiliza la API de Windows (Creación de un proceso hijo con entrada redirigidas y salida) para capturar la salida estándar de de Microsoft Windows PowerShell.

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 es necesario utilizar parámetro no documentado “-InputFormat ninguno”:

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

Esto hizo el truco para mí.

+1

Por lo general, es una buena forma de 'vincular' a la fuente (sitio) también, suponiendo que es'! NSFW'. –

2

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

powershell.exe -executionPolicy Unrestricted 

Entonces seguramente funcionará.

Cuestiones relacionadas