2010-03-01 156 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"');