在字串和檔案中尋找文字。
語法
Select-String [-Path] <string[]> [-Pattern] <string[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <string>] [-Exclude <string[]>] [-Include <string[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>] Select-String -InputObject <psobject> [-Pattern] <string[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <string>] [-Exclude <string[]>] [-Include <string[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>]
描述
Select-String Cmdlet 會在輸出字串或檔案中搜尋文字和文字模式。您可以像 UNIX 的 Grep 和 Windows 的 Findstr 一樣使用它。
Select-String 是以文字行為主。根據預設,Select-String 會在每一行尋找第一個相符項目,而且針對每個相符項目會顯示檔名、行號和有相符項目的行中的所有文字。
不過,您可以指示此 Cmdlet 在每一行偵測多個相符項目、顯示相符項目前後的文字,或只顯示代表是否找到相符項目的布林值 (true 或 false)。
Select-String 會使用規則運算式比對,但也能執行單一比對,搜尋您所指定的輸入文字。
Select-String 能顯示所有的文字相符項目,或在每個輸入檔中的第一個相符項目後停止。它也能顯示所有不符合指定之模式的文字。
您也可以指定 Select-String 應該採用特定字元編碼,例如在搜尋 Unicode 文字的檔案時。
參數
-AllMatches
在每一行文字搜尋一個以上的相符項目。若沒有此參數,Select-String 只會在每一行文字尋找第一個相符項目。
Select-String 在每一行文字找到一個以上的相符項目時,只會為該行發出一個 MatchInfo 物件,但物件的 Matches 屬性則會包含所有的相符項目。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-CaseSensitive
執行有大小寫之分的比對。根據預設,比對項目時沒有大小寫之分。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Context <Int32[]>
擷取有相符項目的行前後的指定行數。這能讓您在內容中檢視相符項目。
如果輸入一個數字做為此參數的值,該數字會決定在相符項目前後所擷取的行數。如果輸入兩個數字做為此參數的值,第一個數字會決定在相符項目之前的行數,第二個數字會決定在相符項目之後的行數。
根據預設檢視,在顯示的第一欄中會用右角括弧 (ASCII 62) 表示有相符項目的行。沒有標記的行則是內容。
此參數不會變更 Select-String 所產生的物件數。Select-String 會為每個相符項目產生 MatchInfo (Microsoft.PowerShell.Commands.MatchInfo) 物件。內容在物件的 Context 屬性中會儲存為字串的陣列。
當您透過管道將 Select-String 命令的輸出傳送給另一個 Select-String 命令時,接收端的命令只會搜尋相符的行 (MatchInfo 物件的 Line 屬性值) 中的文字,而非內容行中的文字。因此,Context 參數對接收端的 Select-String 命令無效。
當內容包含相符項目時,每個相符項目的 MatchInfo 物件都會包含所有的內容行,但重疊的行只會在顯示中出現一次。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Encoding <string>
指定 Select-String 在搜尋檔案時所應採用的字元編碼。預設為 UTF8。
有效的值包括:"UTF7"、"UTF8"、"UTF32"、"ASCII"、"Unicode"、"BigEndianUnicode"、"Default" 和 "OEM"。"Default" 為系統目前的 ANSI 字碼頁的編碼。"OEM" 為作業系統目前的原始設備製造商字碼頁識別元。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Exclude <string[]>
排除指定的項目。此參數的值用於限定 Path 參數。輸入路徑元素或模式,例如 "*.txt"。允許使用萬用字元。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Include <string[]>
只包含指定的項目。此參數的值用於限定 Path 參數。輸入路徑元素或模式,例如 "*.txt"。允許使用萬用字元。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-InputObject <psobject>
指定要搜尋的文字。請輸入包含文字的變數,或輸入可取得文字的命令或運算式。
必要? |
true |
位置? |
named |
預設值 |
|
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
false |
-List
只傳回每個輸入檔中的第一個相符項目。根據預設,Select-String 會為每個找到的相符項目傳回 MatchInfo 物件。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-NotMatch
尋找不符合指定之模式的文字。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Path <string[]>
指定要搜尋的檔案之路徑。允許使用萬用字元。預設位置為本機目錄。
請指定目錄中的檔案,例如 "log1.txt"、"*.doc" 或 "*.*"。如果只指定目錄,命令會失敗。
必要? |
true |
位置? |
2 |
預設值 |
|
接受管線輸入? |
true (ByPropertyName) |
接受萬用字元? |
false |
-Pattern <string[]>
指定要尋找的文字。請輸入字串或規則運算式。若要輸入字串,請使用 SimpleMatch 參數。
若要深入了解規則運算式,請參閱 about_Regular_Expressions。
必要? |
true |
位置? |
1 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Quiet
傳回布林值 (true 或 false),而非 MatchInfo 物件。如果找到模式,則該值為 "true",否則為 "false"。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-SimpleMatch
使用簡單比對,而不使用規則運算式比對。透過簡單比對,Select-String 會搜尋輸入以找出 Pattern 參數中的文字,但不會將 Pattern 參數的值解譯為規則運算式陳述式。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
<CommonParameters>
這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.
輸入和輸出
輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。
輸入 |
System.Management.Automation.PSObject 您可經由管道將具有 ToString 方法的任何物件輸出至 Select-String。 |
輸出 |
Microsoft.PowerShell.Commands.MatchInfo 或 System.Boolean 根據預設,輸出為一組 MatchInfo 物件 (找到的每個相符項目各一個物件)。如果您使用 Quiet 參數,輸出則為指出是否找到模式的布林值。 |
附註
Select-String 如同 UNIX 的 Grep 命令和 Windows 的 FindStr 命令。
若要使用 Select-String,請輸入要尋找的文字做為 Pattern 參數的值。
若要指定要搜尋的文字,請進行下列步驟:
-- 用引號括住的字串輸入文字,然後經由管道將它輸出至 Select-String。
-- 將文字字串儲存到變數,然後將該變數指定為 InputObject 參數的值。
-- 如果文字已儲存在檔案中,請使用 Path 參數指定檔案的路徑。
根據預設,Select-String 會將 Pattern 參數的值解譯為規則運算式 (如需詳細資訊,請參閱 about_Regular_Expressions)。不過,您可以使用 SimpleMatch 參數覆寫規則運算式比對。SimpleMatch 參數會在輸入中尋找 Pattern 參數值的例項。
Select-String 的預設輸出為 MatchInfo 物件,內含有關相符項目的詳細資訊。此物件中的資訊有助於搜尋檔案中的文字,因為 MatchInfo 物件具有 Filename 和 Line 之類的屬性。如果輸入的來源不是檔案時,這些參數的值會是 "InputStream"。
如果您不需要 MatchInfo 物件中的資訊,請使用 Quiet 參數,它傳回的是代表是否找到相符項目的布林值 (true 或 false),而非 MatchInfo 物件。
比對片語時,Select-String 會使用目前針對系統所設定的片語。若要尋找目前的文化特性,請使用 Get-Culture Cmdlet。
若要找出 MatchInfo 物件的屬性,請輸入下列命令:
select-string -path test.txt -pattern "test" | Get-Member | Format-List -property *
範例 1
C:\PS>"Hello","HELLO" | select-string -pattern "HELLO" -casesensitive 描述 ----------- 這個命令會對已經由管道輸出至 Select-String 命令的文字,執行有大小寫之分的比對。 因此,Select-String 只會尋找 "HELLO",因為 "Hello" 不符。 因為每個以引號括住的字串都被視為一行,所以如果沒有 CaseSensitive 參數,Select-String 會將上述兩個字串都辨識為相符項目。
範例 2
C:\PS>select-string -path *.xml -pattern "the the" 描述 ----------- 這個命令會在目前目錄中搜尋副檔名為 .xml 的所有檔案,並顯示那些檔案中包含字串 "the the" 的行。
範例 3
C:\PS>select-string -path $pshome\en-US\*.txt -pattern "@" 描述 ----------- 這個命令會搜尋 Windows PowerShell 概念性說明檔 (about_*.txt) 以找出 @ 符號用法的相關資訊。 為了包含路徑,這個命令使用 $pshome 自動變數的值,此變數儲存了 Windows PowerShell 安裝目錄的路徑。這個範例命令會搜尋 en-US 子目錄,其內含 Windows PowerShell 的英文 (美國) 版說明檔。
範例 4
C:\PS>function search-help { $pshelp = "$pshome\es\about_*.txt", "$pshome\en-US\*dll-help.xml" select-string -path $pshelp -pattern $args[0] } 描述 ----------- 這個簡單函數會使用 Select-String Cmdlet 搜尋 Windows PowerShell 說明檔以找出特定字串。這個範例函數會搜尋 "en-US" 子目錄以找出英文 (美國) 版說明檔。 若要使用這個函數找出字串,例如 "psdrive",請輸入 "search-help psdrive"。 若要在任何 Windows PowerShell 主控台中使用這個函數,請變更路徑,讓它指向您系統上的 Windows PowerShell 說明檔,然後將這個函數貼入 Windows PowerShell 設定檔。
範例 5
C:\PS>$events = get-eventlog -logname application -newest 100 C:\PS> $events | select-string -inputobject {$_.message} -pattern "failed" 描述 ----------- 這個範例會在事件檢視器應用程式記錄檔的 100 個最新的事件中搜尋 "failed" 字串。 第一個命令會使用 Get-EventLog Cmdlet 從應用程式事件記錄檔取得 100 個最新的事件,然後將這些事件儲存到 $events 變數。 第二個命令會使用管線運算子 (|) 將 $events 變數中的事件傳送給 Select-String,並使用 InputObject 參數來代表來自 $events 變數的輸入。InputObject 參數的值是每個物件通過管線時的 Message 屬性。$_ 符號代表目前的物件。 當每個事件到達管線時,Select-String 會搜尋其 Message 屬性的值以找出 "failed" 字串,然後顯示任何包含該相符項目的行。
範例 6
C:\PS>get-childitem c:\windows\system32\* -include *.txt -recurse | select-string -pattern "Microsoft" -casesensitive 描述 ----------- 這個命令會分析 C:\Windows\System32 的子目錄中副檔名為 .txt 的所有檔案,並找出 "Microsoft" 字串。CaseSensitive 參數表示 "Microsoft" 中的 "M" 必須是大寫的,而其餘字元必須是小寫的,才算是 Select-String 找到相符項目。
範例 7
C:\PS>select-string -path process.txt -pattern idle, svchost -notmatch 描述 ----------- 這個命令會在 Process.txt 檔案中尋找不包含 "idle" 或 "svchost" 字詞的文字行。
範例 8
C:\PS>$f = select-string -path audit.log -pattern "logon failed" -context 2, 3 C:\PS> $f.count C:\PS> ($f)[0].context | format-list 描述 ----------- 第一個命令會搜尋 Audit.Log 檔案以找出 "logon failed" 片語,並使用 Context 參數擷取相符項目的前 2 行和後 3 行。 第二個命令會使用物件陣列的 Count 屬性來顯示找到的相符項目數,在本例中為 2。 第三個命令會顯示第一個 MatchInfo 物件的 Context 屬性中所儲存的行。此命令會使用陣列標記法表示第一個相符項目 (符合以零為起始的陣列中的 0),並使用 Format-List Cmdlet 將 Context 屬性的值顯示成清單。 輸出會包含兩個 MatchInfo 物件,偵測到的每個相符項目各一個。內容行會儲存在 MatchInfo 物件的 Context 屬性中。
範例 9
C:\PS>$a = get-childitem $pshome\en-us\about*.help.txt | select-string -pattern transcript C:\PS> $b = get-childitem $pshome\en-us\about*.help.txt | select-string -pattern transcript -allmatches C:\PS> $a C:\Windows\system32\WindowsPowerShell\v1.0\en-us\about_Pssnapins.help.txt:39: Start-Transcript and Stop-Transcript. C:\PS> $b C:\Windows\system32\WindowsPowerShell\v1.0\en-us\about_Pssnapins.help.txt:39: Start-Transcript and Stop-Transcript. C:\PS>> $a.matches Groups : {Transcript} Success : True Captures : {Transcript} Index : 13 Length : 10 Value : Transcript C:\PS> $b.matches Groups : {Transcript} Success : True Captures : {Transcript} Index : 13 Length : 10 Value : Transcript Groups : {Transcript} Success : True Captures : {Transcript} Index : 33 Length : 10 Value : Transcript 描述 ----------- 這個範例會示範 Select-String 之 AllMatches 參數的效果。AllMatches 會在每一行尋找所有模式比對項目,而不只是在每一行尋找第一個相符項目。 這個範例中的第一個命令會搜尋 Windows PowerShell 概念性說明檔 ("about" 說明) 以找出 "transcript" 字詞的例項。第二個命令與第一個完全一樣,但多了一個 AllMatches 參數。 第一個命令的輸出會儲存到 $a 變數。第二個命令的輸出會儲存到 $b 變數。 在顯示這兩個變數的值時,預設顯示會完全相同,如範例輸出所示。 但是,第五個和第六個命令會顯示每個物件的 Matches 屬性值。第一個命令的 Matches 屬性只包含一個相符項目 (也就是一個 System.Text.RegularExpressions.Match 物件),而第二個命令的 Matches 屬性則包含行中兩個相符項目的物件。
請參閱