2010-03-01 34 views
7

Đang cố gắng để chạy lệnh sau trong php để chạy lệnh PowerShell ...PHP Powershell lệnh

các công việc sau:

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

tôi không thể chạy nó như thế này:

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

nó sẽ không vượt qua đường ống | nhân vật

nhưng nếu tôi cố gắng chạy:

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

tôi nhận được không có đầu ra.

Sau đây:

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

lợi nhuận:

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

Mọi góp ý về lý do tại sao điều này xảy ra và làm thế nào để sửa lỗi này?

Chỉnh sửa: Ngoài ra tôi có thể chạy dưới dạng tập lệnh .ps1 nhưng tôi muốn có thể chuyển $ var sang tệp đó.

Trả lời

4

Tôi sẽ bị đâm mặc dù tôi không có kinh nghiệm PHP nào.

Tôi có cảm giác rằng những gì đang xảy ra là ký tự ống của bạn đang được diễn giải bởi trình bao lệnh thay vì PowerShell. Ví dụ: nếu bạn chạy các lệnh sau tại dấu nhắc lệnh cmd.exe:

dir /s | more 

Đầu ra của lệnh đầu tiên được dẫn đến đầu vào thứ hai giống như bạn mong đợi trong PowerShell.

Thoát chuỗi sẽ chỉ làm cho vấn đề tồi tệ hơn vì bạn đang chuyển đổi chuỗi theo cách mà PowerShell không có ý tưởng làm thế nào để unescape nó.

Hãy thử kèm theo biểu hiện PowerShell ban đầu của bạn trong một báo như sau:

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

Hoặc tốt nhất, có vẻ như có một exec() chức năng mà không đi qua các lệnh shell. Điều này có thể hoạt động tốt hơn.

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

shell_exec ('powershell -c "get-dịch vụ | nơi đối tượng {$ _ tình trạng -eq \." Chạy \ "}');! làm việc như một say mê Josh, Cảm ơn –

+0

Cho exec Kể từ khi bạn đang gọi PowerShell trực tiếp, không cần phải thực hiện lệnh shell đầu tiên, nó cũng có thể tránh các vấn đề với các ký tự khác như ký hiệu phần trăm – Josh

+0

Không thích lệnh exec. –

2
'powershell get-service | group-object' 

sẽ được hiểu là

  1. chạy PowerShell và vượt qua nó được phục vụ như một cuộc tranh cãi
  2. sau đó ống đầu ra của PowerShell để group_object (tức là không phải là sản phẩm của get-service)

Điều bạn muốn dành cho quyền hạn địa ngục để xem get-service | group-object là đối số của nó, vì vậy bạn phải kèm theo trong dấu ngoặc kép, như thế này.

$output = shell_exec('powershell "get-service | group-object"'); 
Các vấn đề liên quan