2011-07-09 19 views
11

Tôi có một câu hỏi đơn giản nhưng cũng là người mới bắt đầu trong PowerShell. Tôi nghĩ rằng nó đã làm với thực tế là đầu ra của các lệnh ps là các đối tượng và không phải văn bản.Lọc đầu ra của lệnh như thể đó là văn bản

Điều tôi muốn làm là lấy danh sách các dịch vụ đang chạy có tên "sql" trong đó.

Đây là những gì tôi đã cố gắng cho đến nay nhưng mọi nỗ lực trả về không có gì:

get-service | where {$_ -match 'sql'} 

get-service | where {$_ -like 'sql'} 

get-service | select-string sql 

Tôi đang tìm kiếm một mô hình cho phép tôi đối xử với đầu ra của mỗi lệnh văn bản như tìm kiếm.

Trả lời

5

Các câu trả lời khác là đúng tất nhiên về câu hỏi cụ thể của bạn về dịch vụ bắt đầu có "sql" trong tên của họ, nhưng để trả lời câu hỏi chung:

Bạn có thể làm get-service | out-string và bạn sẽ nhận được kết quả dưới dạng chuỗi, giống như cách các lệnh Unix hoạt động.

Ngoài ra khi đầu ra được chuyển đến các lệnh không cấp quyền, nó được chuyển thành văn bản, ví dụ: get-service | grep sql sẽ hoạt động theo cách bạn muốn.

Nhưng một lần nữa, như @ JPBlanc nói, nó là tốt nắm lấy cách Powershell hoạt động, đó là kết quả đầu ra là đối tượng. Nó cung cấp cho bạn cách kiểm soát nhiều hơn và giữ mọi thứ đơn giản và dễ đọc (các lệnh Unix với sed, awk và những gì không hoạt động trên đầu ra văn bản của các đầu ra lệnh khác có thể rất khó hiểu!)

+0

Xin chào manojlds, – buckley

+0

Đây là câu trả lời chung mà tôi đang tìm kiếm để tôi đánh dấu câu trả lời của bạn. Để có được một lần nữa cụ thể, đây là cách tôi nghĩ rằng tôi lọc danh sách cho SQL: get-service | out-string | findstr SQL Cũng nên có thể với chuỗi lựa chọn mà tôi nghĩ. @mjolinor Cảm ơn bạn đã làm rõ. Tôi đến từ một đối tượng C# vì vậy tôi biết những lợi thế của cấu trúc cứng nhắc này. Những gì tôi đang tìm kiếm ở đây là một cách nhanh chóng ("scripty"?) Để có được những gì tôi muốn ở dòng lệnh. Tôi đồng ý rằng nếu điều này được yêu cầu trong một kịch bản sản xuất, chúng ta nên sử dụng các đối tượng/thuộc tính vì chúng được bảo trì nhiều hơn – buckley

+1

Một điều cần xem với Out-String là nó cắt ngắn 80 ký tự theo mặc định. Tôi thường làm blah | Out-String -Width 1kb hoặc -Width 10kb để tránh điều này. –

10

Bạn đang làm việc quá chăm chỉ vào nó:

get-service *sql* 
+0

Câu trả lời này thực sự sai. Điều này làm là tìm kiếm thông qua các tham số .Name của các đối tượng, nhưng không phải thông qua tất cả các tham số được hiển thị trong đầu ra văn bản. Vì vậy, "Get-service * Stopped *" không trả về gì cả, trong khi "Get-Service | out-string | findstr Stopped" sẽ. Đây là câu hỏi của OP ... – Wouter

+0

Để rõ ràng, khi tìm kiếm một dịch vụ cụ thể, cách tiếp cận của bạn có ý nghĩa hơn rất nhiều. Nhưng nếu câu hỏi là "làm thế nào để tìm kiếm đầu ra như thể nó là nơi văn bản" nó sẽ không có kết quả mong muốn. Tôi sẽ không downvote vì nó là một câu trả lời có giá trị, và có thể đã được những gì OP là thực sự tìm kiếm. – Wouter

8

Tom chỉ 'quên nó': o) ra là đối tượng bạn là đúng, và bạn sẽ sử dụng này.

Vì vậy @mjolinor có câu trả lời ngắn nhất nhưng đối với kiến ​​thức của bạn chỉ cần kiểm tra:

Get-service | Get-Member 

Vì vậy, bạn sẽ hiểu rằng

Get-service | Where-Object {$_.name -match ".*sql.*" } 

cũng làm việc, và có bạn đã có văn bản của bạn như một SỞ HỮU của đối tượng

2

Đó là văn bản của tên là tài sản của đối tượng là quan trọng để có được đầu của bạn xung quanh, và làm thế nào để sử dụng các giá trị tài sản trong một bộ lọc.

Một khía cạnh khác của Powershell bạn có thể tận dụng để giải quyết này là lựa chọn tài sản ra khỏi đối tượng với chọn đối tượng:

get-service | select -expand name 

sẽ giúp bạn có một mảng chuỗi với tên của các máy chủ, và hai trong số ban đầu của bạn ba bộ lọc sẽ hoạt động trên đó. Giống như không phải là đi làm vì không có ký tự đại diện trong chuỗi thử nghiệm. Điều duy nhất nó sẽ bao giờ phù hợp chỉ là 'sql'.

Tôi vẫn tin rằng giải pháp đầu tiên tôi đăng là tốt nhất. Điều quan trọng là phải biết làm thế nào để lọc muộn, nhưng cũng làm thế nào để sử dụng lọc sớm khi bạn có thể.

1

Nếu bất cứ ai muốn biết thêm thông tin về hoạt động hợp lý, xin vui lòng xem http://technet.microsoft.com/en-us/library/ee177028.aspx

-lt - Ít hơn

• -le - Nhỏ hơn hoặc bằng

• -gt - - Lớn hơn

• -ge - Lớn hơn hoặc bằng

• -eq - Bằng

• -ne - Không bằng

• -like - Giống như; sử dụng ký tự đại diện cho mô hình kết hợp

get-service | where {$_ -match 'sql'} would be get-service | where {$_ -eq "sql"}

get-service | where {$_ -like 'sql'} would be get-service | where {$_ -like "sql"}

Và bây giờ là một ví dụ thực tế.

PS C:\> Get-Service | where {$_.name -like "net*"}

Status Name DisplayName
------ ---- -----------
Running Net Driver HPZ12 Net Driver HPZ12
Running Netlogon Netlogon

3
Get-service | Select-String -Pattern "sql" 

này hoạt động giống như grep. Và bạn thậm chí có thể loại

Get-service | Select-String -Pattern "sql" | sort 
+0

là có bất kỳ lý do này sẽ không hoạt động trong PS2? Mỗi $ PSVersionTable.PSVersion của tôi. Tôi giống như OP ban đầu, tôi không thể làm việc đó, ở đây tôi đã thử một "đơn giản", "sự kiện" hoặc "sự kiện *" cho nhật ký sự kiện và mặc dù các dịch vụ get-service trả về số không. ty! – AnneTheAgile

0

Hầu hết các câu trả lời ở đây tập trung vào việc tìm kiếm tên dịch vụ với "sql" trong tên, không phải trên lọc toàn bộ đầu ra như thể nó là văn bản. Ngoài ra, câu trả lời được chấp nhận sử dụng một hàm không có quyền hạn "findstr".

Vì vậy, đương nhiên, những gì sau không phải là giải pháp thanh lịch nhất, nhưng vì lợi ích của sự hoàn chỉnh tôi muốn cung cấp các giải pháp PowerShell 100% mà có vấn đề OP nghĩa đen:

(get-Service | Out-String) -split "`r`n" | Select-String sql 
  • Chúng tôi cần Out-String vì việc sử dụng các giải pháp được cung cấp trong các câu trả lời khác không cung cấp cho chúng tôi đầu ra văn bản đầy đủ của lệnh Get-Service, chỉ tham số Name.
  • Chúng ta cần phải phân tách trên dòng mới, vì Select-String dường như coi toàn bộ văn bản là một chuỗi dài và trả về toàn bộ văn bản, nếu tìm thấy "sql" trong đó.
  • Tôi sử dụng Select-String thay vì findstr, vì findstr không phải là chức năng PowerShell.

Đây là câu trả lời thuần túy và trong thực tế, đối với trường hợp sử dụng cụ thể này, tôi sẽ không khuyến nghị sử dụng. Nhưng đối với những người đến đây thông qua google dựa trên tiêu đề câu hỏi, đây là câu trả lời chính xác hơn ...

0

Bạn có thể muốn điều này:

Function Select-ObjectPropertyValues { 
    param(
    [Parameter(Mandatory=$true,Position=0)] 
    [String] 
    $Pattern, 
    [Parameter(ValueFromPipeline)] 
    $input) 

    $input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output 
} 

Những gì chúng ta đang làm gì ở đây đang diễn ra mặc dù mỗi thuộc tính của một đối tượng để xem nếu nó phù hợp với mô hình nhất định. Nếu đối tượng chứa một hoặc nhiều thuộc tính như vậy, chúng ta sẽ ghi nó ra. Kết quả cuối cùng: grep bởi tất cả các thuộc tính của một đối tượng.

Đặt tệp trong tệp cấu hình của bạn và grep vào nội dung trái tim của bạn.

Các vấn đề liên quan