2016-07-23 73 views
2

的運行Windows PowerShell我對所有機器的用戶,像這樣定義的幾個函數和變量:從PHP不知道當前配置

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

讓我們叫的我定義的函數Do-Stuff之一。 這工作得很好。隨時調用Powershell控制檯,並輸入「Do-Stuff」+ ENTER,它就可以工作。

現在我試圖調用此函數從PHP的一些方法,並且我有兩個問題。試想一下:

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

我得到的是這樣的錯誤:

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

我也試過:

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

如果文件script.ps1確實含有Do-Stuff或任何其他的定義函數,我得到的是相同類型的錯誤消息。

現在這是什麼告訴我的是,調用PHP腳本沒有被識別爲Windows機器的用戶,並沒有施加當前加載$Profile

那麼,有什麼解決辦法嗎?我如何獲取當前用戶或所有用戶的加載配置文件以應用於正在運行的PHP腳本?

回答

0

我有一個辦法解決這個問題,使用-NoProfile,然後點採購的配置文件。

在下面的例子中,配置文件是includes.ps1

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

它可能證明是有用的,爲您附上這在可重複使用的功能:

<?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; 
} 
?> 

$async參數允許你運行這個沒有PHP的命令會等待PowerShell腳本的輸出。其優點是,PHP代碼執行速度更快,缺點是:你不知道,如果你的腳本運行成功,或者鑽進在途中任何麻煩;)

相關問題