2017-07-04 133 views
2

我正在嘗試編寫一個簡單的PS腳本來檢查短字符串的大型.txt日誌文件:「SRVE0242I:」Powershell中的Select-String只顯示文本文件中的部分行,需要它顯示整個事物

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String 

在輸出雖然,它僅顯示以下內容:


[28/06/17 13:48:27:839] 00000020 ServletWrappe我SRVE0242I:[用戶] [用戶] [ com_xxxxxxx _...

而不是整行。這個拉多少個字符有限制嗎?我無法找到有關Select-String cmdlet的任何限制的信息。有沒有更好的方法來做到這一點,所以我不會a)在我的行列表中拉出標題「Line」(不想真的想爲這樣一個簡單的輸出創建表格格式)和b)整個行當我拉動信息?

回答

1

還有!長話短說,Select-Object在這裏進行截斷。下面就來獲得第一未截斷線中選擇字符串輸出

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line 

的一種方式。當你遇到這樣的事情,你可以打破的各個步驟,以確定是什麼通過管道事情的發生給Get-Member。這裏發生的事情在上面的代碼:

Select-String <# args #> | Get-Member 

Select-String會爲我們提供了一個MatchInfo對象,(因爲你已經正確地確定)有一個「行」屬性。當它自己運行時,Select-String實際上會吐出所有您要查找的信息,並且不會在默認情況下截斷它(至少在v6.0.0-beta上)。如果發現多個匹配,它會爲您提供一個MatchInfo對象數組,因此如果您只想要第一個匹配項(如上所述),則必須將其索引到該數組中。

Select-String <# args #> | Select-Object Line | Get-Member 

選擇,適用對象PowerShell的默認格式,在大多數情況下,將截斷你的輸出以方便查看的對象。對於有一堆成員的對象(比如MatchInfo對象),默認情況下它會嘗試每行執行一個。

Select-String <# args #> | Select-Object Line | Out-String | Get-Member 

輸出字符串直接翻譯它輸入一個字符串。也就是說,不是嘗試將某些東西轉換爲字符串,或者將字符串屬性從傳遞給它的對象中取出,只是將接收到的東西改變爲對象。在這種情況下,它將已經格式化的MatchInfo輸出轉換爲字符串。終端上的輸出沒有任何反應,但Get-Member將顯示一個String而不是MatchInfo對象。

這裏沒有直接關係,但如果您有興趣修改默認格式,則需要使用types.ps1xml文件進行管理。

2

您看到它是這樣的,因爲它使用默認的Format-Table視圖顯示Line屬性,並將其縮小到控制檯的寬度。

而是執行此操作:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line 

這將返回Line屬性的值作爲一個字符串變量$lines。你不需要使用Out-String

相關問題