2015-02-08 269 views
1

我有以下問題:通過php執行powershell命令

我有一臺xampp服務器正在運行,我希望它執行一個powershell。一個PHP觸發.bat文件包含以下代碼:

@echo 
cd C:\OpenBR\bin 
start /WAIT br -algorithm FaceRecognition -compare C:\xampp\htdocs\upload C:\xampp\htdocs\DP C:\xampp\htdocs\results\result.csv 


start /WAIT C:\xampp\htdocs\CSVconvert\sortieren.ps1 

start /WAIT C:\xampp\htdocs\CSVconvert\Removedouble.ps1 

start /WAIT C:\xampp\htdocs\CSVconvert\remove_path.ps1 

start /WAIT C:\xampp\htdocs\CSVconvert\remove_foo.ps1 

start C:\xampp\htdocs\CSVconvert\remove_quoatation.ps1 

第一部分工作正常,直到當我想執行的是PowerShell的「sortieren.ps1」的地步。當我手動運行批處理時,它會執行並執行作業,當通過php觸發時,它不會。 我在x86和x64 shell中設置了「Set-ExecutionPolicy Unrestricted」。 我只是困惑,因爲正常的命令行工作和PowerShell沒有,即使設置爲不受限制。

我看 executing a Powershell script from phpPowerShell on Windows 7: Set-ExecutionPolicy for regular users 但未能解決問題。 我錯過了什麼?

+0

開始將主要像打開ps1文件一樣,如果您雙擊它而不是運行腳本,您可以嘗試將Start行改爲'Start/Wait C:\ windows \ system32 \ WindowsPowerShell \ v1.0 \ Powershell。 exe文件C:\ xampp \ htdocs \ CSVconvert \ sortieren.ps1'或者'Start/Wait Powershell -file C:\ xampp \ htdocs \ CSVconvert \ sortieren.ps1' – Bluecakes 2015-02-08 23:27:50

回答

2

您正在運行這些命令的會話沒有與使用PowerShell手動運行它們時相同的環境變量。您必須指定可執行的powershell的絕對路徑以及您想要運行的腳本,以便找到它們。

start /WAIT C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\xampp\htdocs\CSVconvert\sortieren.ps1 
+0

就是這樣。謝謝! – 2015-02-09 08:21:07

+0

手動運行它們時,您使用Powershell IDE還是CMD? 我想你正在使用IDE,在那裏你提供額外的設置。 嘗試使用CMD測試cmdline以找出所需的特殊設置。 – 2015-02-09 08:23:08

0

由於問題是環境,我認爲你可能會受益於自動處理該方面的包。這是一個允許PHP獲取和動態地與真實Powershell交互的項目。在這裏獲得:https://github.com/merlinthemagic/MTS

下載您只需使用下面的代碼後:

$shellObj = \MTS\Factories::getDevices()->getLocalHost()->getShell('powershell'); 

$strCmd1 = 'first command from first script'; 
$return1 = $shellObj->exeCmd($strCmd1); 

$strCmd2 = 'second command from first script'; 
$return2 = $shellObj->exeCmd($strCmd2); 

而是觸發一個腳本,你可以只單獨觸發每個命令和處理的回報。您可以針對$ shellObj發出任何您喜歡的命令,該環境在PHP腳本的整個生命週期中都保持不變。