2016-07-23 8 views
2

Ich habe ein paar Funktionen und Variablen für alle Maschinen Benutzer definiert wie folgt:Ausführen von Windows Powershell von PHP nicht bewusst Aktuelles Profil

Set-Content $Profile.AllUsersCurrentHost (Get-Content path/to/myprofile.ps1) 

des Do-Stuff einer meiner definierten Funktionen aufrufen lassen. Das funktioniert sehr gut. Und wann immer die Powershell-Konsole aufgerufen wird und Sie "Do-Stuff" + ENTER eingeben, funktioniert es.

Jetzt habe ich versucht, diese Funktion von PHP ein paar Möglichkeiten zu nennen, und ich habe ein paar Probleme. Bedenken Sie:

$res = shell_exec('Powershell Do-Stuff'); 
print_r($res); 

Was ich erhalte, ist dieser Fehler:

Do-Stuff: The term 'Do-Stuff' is not recognized as the name of a 
cmdlet, function, script file, or operable program.... 

ich auch versucht habe:

$res = shell_exec('Powershell -File path/to/script.ps1'); 
print_r($res); 

Wenn die Datei script.ps1Do-Stuff enthält oder eine der anderen definiert Funktionen, was ich bekomme, ist die gleiche Art von Fehlermeldung.

Nun, was mir sagt, ist, dass das aufrufende PHP-Skript nicht als Windows-Rechner Benutzer erkannt wird, und die aktuell geladene $Profile wird nicht angewendet.

Also, was ist die Lösung dafür? Wie kann ich das geladene Profil für den aktuellen Benutzer oder alle Benutzer erhalten, die auf das laufende PHP-Skript angewendet werden sollen?

Antwort

0

Ich habe eine Problemumgehung für dieses Problem mit -NoProfile, dann dot-sourcing die Profildatei.

Im folgenden Beispiel wird die Profildatei ist includes.ps1:

$cmdlet = 'Do-Stuff'; 
$cmd = 'Powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { . \includes.ps1; '.$cmdlet.' }"'; 
shell_exec($cmd); 

Es kann nützlich sein für Sie, dies in einer wieder verwendbaren Funktion einzuschließen:

<?php 
function run_ps_command($cmdlet, $async=true){ 
    $cmd = 'Powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { . \Includes.ps1; '.$cmdlet.' }"'; 
    if($async){ 
     $WshShell = new COM("WScript.Shell"); 
     $res = $WshShell->Run($cmd, 0, false); 
    }else{ 
     $res = shell_exec($cmd); 
    } 
    return $res; 
} 
?> 

Das $async Argument ermöglicht es Ihnen, laufen Dieser Befehl ohne PHP wartet auf die Ausgabe des PowerShell-Skripts. Der Vorteil ist, dass die Ausführung von PHP-Code schneller ist, der Nachteil ist: Sie haben keine Ahnung, ob Ihr Skript erfolgreich ausgeführt wurde oder auf dem Weg in Schwierigkeiten geraten ist;)