2011-07-09 58 views
11

我有一個簡單的問題,但也是PowerShell中的初學者。我認爲這與ps命令的輸出是對象而不是文本有關。過濾命令的輸出就好像它是文本

我想要做的是獲得運行中的名稱爲「sql」的服務的列表。

這是我嘗試過,但她的每一次嘗試沒有返回值:

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

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

get-service | select-string sql 

我找的,讓我對待每一個命令搜索文本的輸出模式。

回答

5

其他答案當然是關於你的具體問題的啓動服務,其名稱中有「sql」,但回答一般問題:

你可以做get-service | out-string,你會得到輸出爲字符串,很像Unix命令的工作方式。

此外,當輸出連接到非PowerShell命令時,它會轉換爲文本,因此例如:get-service | grep sql會以您想要的方式工作。

但是,就像@JPBlanc所言,它很好地支持Powershell的工作方式,即輸出是對象。它給你提供了更多的控制方式,讓事情變得簡單和可讀(Unix命令使用sed,awk以及其他命令輸出的文本輸出不能操作的東西可能會變得非常神祕!)

+0

你好manojlds, – buckley

+0

這是我一直在尋找的通用答案,所以我標記你的答案。 要再次具體說明,這是我認爲如何過濾SQL列表: get-service | out-string | findstr SQL 我認爲應該也可以使用select-string。 @mjolinor 謝謝澄清。我來自C#對象,所以我很瞭解這個剛性結構的優點。我在這裏尋找的是一種快速的(「scripty」?)方式來獲得我想要的命令行。我同意如果在生產腳本中這是必需的,我們應該使用對象/屬性,因爲它們更易於維護。 – buckley

+1

Out-String要注意的一件事是默認情況下它會截斷80個字符。我通常會這樣做Out-String -Width 1kb或-Width 10kb來避免這種情況。 –

10

你在它的工作方式太辛苦:

get-service *sql* 
+0

這個答案其實是錯誤的。它所做的是搜索對象的.Name參數,但不是通過文本輸出中顯示的所有參數。所以「Get-service * Stopped *」什麼也不返回,而「Get-Service | out-string | findstr Stopped」會返回。這是OP的問題...... – Wouter

+0

要清楚的是,當搜索特定服務時,您的方法變得更有意義。但是如果問題是「如何在輸出中搜索文本」那麼它就不會得到期望的結果。我不會低調,因爲這是一個有價值的答案,而且可能是OP真正想要的。 – Wouter

8

湯姆只是「算了吧」:O) 輸出,你是對的對象,你要使用它。

所以@mjolinor擁有最短的答案,但對於你的知識只是測試:

Get-service | Get-Member 

那麼你就會明白,

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

也適用,有你有你的文字作爲物業的物業

2

該名稱的文本是一個屬性的對象非常重要,以及如何在過濾器中使用屬性值。

Powershell的另一個方面,你可以利用來解決,這是選擇性能出與選擇對象的對象:

get-service | select -expand name 

將讓你一個字符串數組服務器的名稱,以及兩個你原來的三個過濾器可以解決這個問題。類似的不起作用,因爲測試字符串中沒有通配符。它唯一會匹配的只是'sql'。

我仍然相信我發佈的第一個解決方案是最好的。知道如何做後期過濾是非常重要的,但如何儘可能早地使用過濾。

1

如果有人想在邏輯操作的更多信息,請參閱http://technet.microsoft.com/en-us/library/ee177028.aspx

-lt - 不到

• -le - 小於或等於

• -gt - - 大於

• -ge - 大於或等於

• 當量 - 等於

• -ne - 不等於

• 樣 - 等;使用通配符模式匹配

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

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

現在一個實際的例子。

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" 

這個作品就像grep的。你甚至可以排序

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

是否有任何理由在PS2中不起作用?根據我的$ PSVersionTable.PS版本。我很喜歡原始的OP,我無法使它工作,在這裏我嘗試了一個簡單的事件日誌事件或事件*,儘管get-service有效,但子集返回nil。 TY! – AnneTheAgile

0

這裏大部分的答案集中在名稱中包含「SQL」,而不是過濾整個輸出找到服務的名稱,如果它是文本。另外,接受的答案使用非powershell函數「findstr」。

所以,理所當然的,接下來是不是最優雅的解決方案,但爲了完整起見,我想提供100%的PowerShell的解決方案,將OP問題字面上:

(get-Service | Out-String) -split "`r`n" | Select-String sql 
  • 我們需要Out-String,因爲使用其他答案中提供的解決方案不能爲我們提供Get-Service命令的全文輸出,只有Name參數。
  • 我們需要在換行符上進行拆分,因爲Select-String似乎將整個文本視爲一個長字符串,並在整個文本中返回它,如果在其中找到「sql」。
  • 我使用Select-String而不是findstr,因爲findstr不是PowerShell函數。

這是一個純粹的答案,在實踐中,對於這個特定的用例,我不會推薦它。但對於通過谷歌來問題標題的人來說,這是一個更準確的答案......

0

你可能想這樣的:

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 
} 

我們這裏做的是去了,雖然對象的每個屬性,看它是否匹配給定模式。如果對象包含一個或多個這樣的屬性,我們將其寫出。最終結果:對象的所有屬性都是grep。

把它放在你的配置文件和grep到你心中的內容。

相關問題