2011-03-15 311 views
9

我試圖從PHP執行powershell腳本,但它似乎不工作。從php執行Powershell腳本

腳本'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,但還是一樣。

+0

看看你正在運行的命令行。 – 2011-03-15 20:17:11

+0

確保進入32位和64位實例並設置執行策略,然後重試。 - > Set-ExecutionPolicy無限制 – 2012-06-04 13:18:41

回答

8

看起來你的命令被單引號包圍。我想如果你刪除它們,你的命令應該運行。

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位的shell中執行此操作。

+0

雙方都很累,沒有運氣。 – heshanh 2011-03-16 02:47:00

+0

剛剛更新了我的答案,以反映您添加的錯誤消息。 – 2011-03-16 15:11:25

+1

好吧計算出來 http://stackoverflow.com/questions/4647429/powershell-on-windows-7-set-executionpolicy-for-regular-users 需要在x86和64位控制檯上運行它我是隻在64位控制檯上進行。 – heshanh 2011-03-16 16:08:14

0

發現這個在其他網站上,我想我會通過它一起:

我調試使用的Windows API(創建具有重定向輸入和輸出一個孩子 過程)中的程序來捕獲標準輸出的 微軟Windows PowerShell。

傳遞給PowerShell(-File開關)的腳本未執行,並且PowerShell剛掛起,直到被任務管理器終止。

事實證明,你需要使用無證參數「-InputFormat 無」:

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

這奏效了我。

+1

這通常是鏈接到源(站點)的好形式,假設它是'!NSFW'。 – 2012-01-09 21:29:32

2

使用「-executionPolicy Unrestricted」以及命令「powershell.exe」。因此,命令將是:

powershell.exe -executionPolicy Unrestricted 

然後它肯定會起作用。