在字串和檔案中尋找文字。

語法

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 屬性則包含行中兩個相符項目的物件。






請參閱




目錄