2010-03-01 154 views
7

試圖在PHP運行下面的命令來運行PowerShell命令......PHP PowerShell命令

了以下工作:

$output = shell_exec(escapeshellcmd('powershell get-service | group-object')); 

我不能像這樣運行:

$output = shell_exec('powershell get-service | group-object'); 

它不會通過管道|性格

,但如果我嘗試運行:

$output = shell_exec(escapeshellcmd('powershell get-service | where-object {$_.status -eq "Running"}')); 

我沒有得到任何輸出。

以下:

$cmd = escapeshellcmd('powershell get-service | where-object {$_.status -eq "Running"}'); 

回報:

powershell get-service ^| where-object ^{^$_.status -eq ^"Running^"^} 

爲什麼發生這種情況,如何解決這個問題有什麼建議?

編輯:另外我可以運行它爲.ps1腳本,但我希望能夠傳遞$ var到它。

回答

4

雖然我沒有任何PHP經驗,但我會採取刺。

我有一種感覺,發生了什麼事是你的管道字符被命令shell而不是PowerShell解釋。例如,如果你跑在CMD.EXE命令提示符下輸入:

dir /s | more 

第一個命令的輸出被輸送到第二的,就像你在PowerShell中所期望的輸入。

轉義字符串只會讓問題變得更糟,因爲您正在轉換字符串的方式使得PowerShell不知道如何忽略它。

嘗試封閉在像下面這樣的報價你原來的PowerShell表達:

$output = shell_exec('powershell.exe -c "get-service | group-object"'); 

或最好,它看起來像有不通過命令行shell去的exec()函數。這可能會更好。

$output = exec('powershell.exe -c get-service | group-object'); 
+1

了shell_exec( 'PowerShell的-c 「獲得服務|其中對象{$ _狀態-eq \」 運行\「}');! 工作就像一個魅力喬希,感謝 – 2010-03-01 02:56:20

+0

給了EXEC因爲你直接調用PowerShell,所以沒有必要首先通過命令行shell,也可以避免其他字符(如百分號)出現問題 – Josh 2010-03-01 02:59:15

+0

不喜歡exec命令。 – 2010-03-01 03:05:52

2
'powershell get-service | group-object' 

將被解釋爲

  1. 運行PowerShell和通過它得到服務作爲參數
  2. 然後通過管道的PowerShell的輸出group_object(即不輸出獲得服務)

你想要的是權力地獄看到get-service | group-object作爲它的論點,所以你必須用引號括起來,像這樣。

$output = shell_exec('powershell "get-service | group-object"');