共用方式為


Select-String

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

語法

Select-String
      [-Pattern] <String[]>
      [-Path] <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <String>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      -InputObject <PSObject>
      [-Pattern] <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <String>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Pattern] <String[]>
      -LiteralPath <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <String>]
      [-Context <Int32[]>]
      [<CommonParameters>]

Description

Select-String Cmdlet 會使用正則表示式比對來搜尋輸入字串和檔案中的文字模式。 您可以使用類似 Unix 中的 grep 或 Windows 中的 findstr.exeSelect-String

Select-String 是以文字行為基礎。 根據預設,Select-String 會尋找每一行中的第一個相符專案,而且,針對每個相符專案,它會顯示包含相符專案之行中的所有檔名、行號和所有文字。 您可以指示 Select-String 尋找每行的多個相符專案、在相符專案前後顯示文字,或顯示布爾值 (True 或 False),指出是否找到相符專案。

Select-String 可以在每個輸入檔中的第一個相符項目之後顯示所有文字相符專案或停止。 Select-String 可用來顯示不符合指定模式的所有文字。

您也可以指定 Select-String 應該要有特定的字元編碼,例如當您搜尋 Unicode 文字的檔案時。 Select-String 會使用位元組順序標記 (BOM) 來偵測檔案的編碼格式。 如果檔案沒有 BOM,則會假設編碼方式為 UTF8。

範例

範例 1:尋找區分大小寫的相符專案

本範例會執行將管線向下傳送至 Select-String Cmdlet 之文字區分大小寫的相符專案。

'Hello', 'HELLO' | Select-String -Pattern 'HELLO' -CaseSensitive -SimpleMatch

hello HELLO 的文字 字串會向下傳送至 Select-String Cmdlet。 Select-String 使用 Pattern 參數來 指定 HELLOCaseSensitive 參數會指定大小寫必須只符合大寫模式。 SimpleMatch 是選擇性參數,並指定模式中的字串不會解譯為正則表達式。 Select-String PowerShell 控制台中會顯示 hello

範例 2:尋找文字檔中的相符專案

此命令會搜尋目前目錄中擴展名為 .txt 的所有檔案。 輸出會顯示包含指定字串之檔案中的行。

Get-Alias | Out-File -FilePath .\Alias.txt
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\*.txt -Pattern 'Get-'

Alias.txt:8:Alias            cat -> Get-Content
Alias.txt:28:Alias           dir -> Get-ChildItem
Alias.txt:43:Alias           gal -> Get-Alias
Command.txt:966:Cmdlet       Get-Acl
Command.txt:967:Cmdlet       Get-Alias

在這裡範例中,Get-AliasGet-Command 會與 Out-File Cmdlet 搭配使用,以在目前目錄中建立兩個文字檔,Alias.txtCommand.txt

Select-String 使用 Path 參數搭配星號 (*) 通配符來搜尋目前目錄中擴展名為 .txt的所有檔案。 Pattern 參數會指定要比對 Get-的文字。 Select-String 會在PowerShell控制台中顯示輸出。 檔名和行號位於每個內容行前面,其中包含 Pattern 參數的相符專案。

範例 3:尋找模式比對

在此範例中,會搜尋多個檔案,以尋找指定模式的相符專案。 此模式會使用正則表示式數量值。 如需詳細資訊,請參閱 about_Regular_Expressions

Select-String -Path "$PSHOME\en-US\*.txt" -Pattern '\?'

C:\Program Files\PowerShell\6\en-US\default.help.txt:27:    beginning at https://go.microsoft.com/fwlink/?LinkID=108518.
C:\Program Files\PowerShell\6\en-US\default.help.txt:50:    or go to: https://go.microsoft.com/fwlink/?LinkID=210614

Select-String Cmdlet 使用兩個參數,PathPatternPath 參數會使用指定 PowerShell 目錄的變數 $PSHOME。 路徑的其餘部分包含子目錄 en-US,並指定目錄中的每個 *.txt 檔案。 Pattern 參數會指定比對每個檔案中的問號(?)。 反斜杠(\)用來作為逸出字元,而且是必要的,因為問號(?)是正則表達式數量值。 Select-String 會在PowerShell控制台中顯示輸出。 檔名和行號位於每個內容行前面,其中包含 Pattern 參數的相符專案。

範例 4:在函式中使用 Select-String

此範例會建立函式來搜尋PowerShell說明檔中的模式。 在此範例中,函式只存在於PowerShell會話中。 關閉 PowerShell 工作階段時,會刪除函式。 如需詳細資訊,請參閱 about_Functions

function Search-Help
{
    $PSHelp = "$PSHOME\en-US\*.txt"
    Select-String -Path $PSHelp -Pattern 'About_'
}

Search-Help

C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:2:   about_ActivityCommonParameters
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:31:  see about_WorkflowCommonParameters.
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:33:  about_CommonParameters.

函式會在PowerShell命令行上建立。 function 關鍵詞會使用名稱 Search-Help。 按 Enter 開始將語句新增至函式。 從 >> 提示字元中,新增每個語句,然後按 Enter,如範例所示。 新增右括弧之後,您就會回到PowerShell提示字元。

函式包含兩個命令。 $PSHelp 變數會儲存PowerShell說明檔的路徑。 $PSHOME 是 PowerShell 安裝目錄,具有指定目錄中每個 檔案的子目錄 *.txt

函式中的 Select-String 命令會使用 PathPattern 參數。 Path 參數會使用 $PSHelp 變數來取得路徑。 Pattern 參數會使用字串 About_ 做為搜尋準則。

若要執行函式,請輸入 Search-Help。 函式的 Select-String 命令會在PowerShell控制台中顯示輸出。

範例 5:搜尋 Windows 事件記錄檔中的字串

此範例會在 Windows 事件記錄檔中搜尋字串。 變數 $_ 代表管線中的目前物件。 如需詳細資訊,請參閱 about_Automatic_Variables

$Events = Get-WinEvent -LogName Application -MaxEvents 50
$Events | Select-String -InputObject {$_.Message} -Pattern 'Failed'

Get-WinEvent Cmdlet 會使用 LogName 參數來指定應用程式記錄檔。 MaxEvents 參數會從記錄檔取得 50 個最新的事件。 記錄內容會儲存在名為 $Events的變數中。

$Events 變數會向下傳送至 Select-String Cmdlet。 Select-String 使用 InputObject 參數。 $_ 變數代表目前的物件,而 Message 是 事件的屬性。 Pattern 參數會指定 失敗 字串,並在 $_.Message中搜尋相符專案。 Select-String 會在PowerShell控制台中顯示輸出。

範例 6:在子目錄中尋找字串

本範例會搜尋目錄及其所有子目錄是否有特定的文字字串。

Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive

Get-ChildItem 會使用 Path 參數來指定 C:\Windows\System32*.txtRecurse 參數包含子目錄。 物件會從管線向下傳送至 Select-String

Select-String 使用 Pattern 參數,並指定字串 MicrosoftCaseSensitive 參數可用來比對字串的確切大小寫。 Select-String 會在PowerShell控制台中顯示輸出。

注意

視您的許可權而定,您可能會在輸出中看到 拒絕存取 訊息。

範例 7:尋找不符合模式的字串

此範例示範如何排除不符合模式的數據行。

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get', 'Set'  -NotMatch

Get-Command Cmdlet 會將物件向下傳送至 Out-File,以在目前目錄中建立 Command.txt 檔案。 Select-String 會使用 Path 參數來指定 Command.txt 檔案。 Pattern 參數會指定 GetSet 做為搜尋模式。 NotMatch 參數會排除結果中 GetSetSelect-String 在 PowerShell 控制台中顯示不包含 GetSet的輸出。

範例 8:尋找相符專案前後的行

此範例示範如何取得相符模式前後的行。

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get-Computer' -Context 2, 3

Command.txt:1186:Cmdlet          Get-CmsMessage            3.0.0.0    Microsoft.PowerShell.Security
  Command.txt:1187:Cmdlet          Get-Command               3.0.0.0    Microsoft.PowerShell.Core
> Command.txt:1188:Cmdlet          Get-ComputerInfo          3.1.0.0    Microsoft.PowerShell.Management
> Command.txt:1189:Cmdlet          Get-ComputerRestorePoint  3.1.0.0    Microsoft.PowerShell.Management
  Command.txt:1190:Cmdlet          Get-Content               3.1.0.0    Microsoft.PowerShell.Management
  Command.txt:1191:Cmdlet          Get-ControlPanelItem      3.1.0.0    Microsoft.PowerShell.Management
  Command.txt:1192:Cmdlet          Get-Counter               3.0.0.0    Microsoft.PowerShell.Diagnostics

Get-Command Cmdlet 會將物件向下傳送至 Out-File,以在目前目錄中建立 Command.txt 檔案。 Select-String 會使用 Path 參數來指定 Command.txt 檔案。 Pattern 參數會將 Get-Computer 指定為搜尋模式。 Context 參數會使用兩個值,前後兩個值,並以角括弧 (>) 標記輸出中的模式相符專案。 Context 參數會在第一個模式比對之前輸出兩行,最後一個模式比對之後的三行。

範例 9:尋找所有模式相符專案

此範例示範 AllMatches 參數如何尋找每一行文字中的每個模式相符專案。 根據預設,Select-String 只會在一行文字中尋找第一個出現的模式。 此範例會使用與 Get-Member Cmdlet 一起找到的物件屬性。

$A = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell'
$A

C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:5:    Describes the parameters that Windows PowerShell
C:\Windows\System32\WindowsPowerShell\v1.0\en-US\about_ActivityCommonParameters.help.txt:9:    Windows PowerShell Workflow adds the activity common

$A.Matches

Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 4
Length   : 10
Value    : PowerShell

$A.Matches.Length

2073

$B = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell' -AllMatches
$B.Matches.Length

2200

Get-ChildItem Cmdlet 會使用 Path 參數。 Path 參數會使用指定 PowerShell 目錄的變數 $PSHOME。 路徑的其餘部分包含子目錄 en-US,並指定目錄中的每個 *.txt 檔案。 Get-ChildItem 物件會儲存在 $A 變數中。 $A 變數會向下傳送至 Select-String Cmdlet。 Select-String 會使用 Pattern 參數來搜尋每個檔案中的字串,PowerShell

從 PowerShell 命令行顯示 $A 變數內容。 有一行包含兩個出現的字串,PowerShell

$A.Matches 屬性會列出每個行上第一次出現的模式 PowerShell

$A.Matches.Length 屬性會計算每個行上第一次出現的模式 PowerShell

$B 變數使用相同的 Get-ChildItemSelect-String Cmdlet,但會新增 AllMatches 參數。 AllMatches 會在每個行找到每個模式 PowerShell。 儲存在 $A$B 變數中的物件完全相同。

$B.Matches.Length 屬性會增加,因為針對每一行,就會計算PowerShell 模式的每一個出現次數。

範例 10 - 使用 'Out-String' 將管線物件轉換成字串

管道物件 ToString() 結果與 PowerShell 格式系統所產生的豐富字串表示不同。 因此,您可能需要使用管線將對象傳送至 Out-String

管線以 Out-String 將格式化的輸出轉換成單一多行字串物件。 這表示當 Select-String 找到相符專案時,它會輸出整個多行字串。

PS> $hash = @{
    Name = 'foo'
    Category = 'bar'
}

# !! NO output, due to .ToString() conversion
$hash | Select-String -Pattern 'foo'

# Out-String converts the output to a single multi-line string object
PS> $hash | Out-String | Select-String -Pattern 'foo'

Name                           Value
----                           -----
Name                           foo
Category                       bar

# Out-String -Stream converts the output to a multiple single-line string objects
PS> $hash | Out-String -Stream | Select-String -Pattern 'foo'

Name                           foo

管線以 Out-String -Stream 將格式化的輸出轉換成多個單行字串物件。 這表示當 Select-String 找到相符專案時,它只會輸出相符行。

參數

-AllMatches

指出 Cmdlet 會在每個文字行中搜尋多個相符專案。 如果沒有此參數,Select-String 只會在每個文字行中找到第一個相符專案。

Select-String 在文字行中找到一個以上的相符專案時,它仍然只會針對該行發出一個 MatchInfo 物件,但物件的 Matchs 屬性包含所有相符專案。

注意

搭配 SimpleMatch 參數使用時,會忽略此參數。 如果您要傳回所有相符專案,以及您要搜尋的模式包含正規表示式字元,您必須逸出這些字元,而不是使用 SimpleMatch。 如需逸出正則表達式的詳細資訊,請參閱 about_Regular_Expressions

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-CaseSensitive

表示 Cmdlet 相符專案區分大小寫。 根據預設,相符專案不會區分大小寫。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Context

擷取符合模式之行前後的指定行數。

如果您輸入一個數位做為此參數的值,該數位會決定相符專案前後擷取的行數。 如果您輸入兩個數位做為值,則第一個數位會決定相符專案之前的行數,而第二個數位會決定相符專案后的行數。 例如,-Context 2,3

在預設顯示中,具有相符專案的行會以顯示第一欄的右角括號 (>) (ASCII 62) 表示。 未標記的行是內容。

Context 參數不會變更 Select-String所產生的物件數目。 Select-String 為每個相符項目產生一個 MatchInfo 物件。 內容會儲存為物件 Context 屬性中的字串陣列。

Select-String 命令的輸出傳送至另一個 Select-String 命令時,接收命令只會搜尋相符行中的文字。 相符行是 matchInfo 物件之 Line 屬性的值,而不是內容行中的文字。 因此,接收 命令上的 Select-String 參數無效。

當內容包含相符專案時,每個相符專案的 MatchInfo 物件都包含所有內容行,但重疊的行只會出現在顯示中一次。

類型:Int32[]
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-Encoding

指定目標檔案的編碼類型。 預設值為 default

此參數可接受的值如下:

  • ascii 使用 ASCII (7 位) 字元集。
  • bigendianunicode 使用 UTF-16 與 big-endian 位元節順序。
  • default 使用對應至系統使用中代碼頁的編碼方式(通常是 ANSI)。
  • oem 使用對應至系統目前 OEM 代碼頁的編碼方式。
  • unicode 使用UTF-16搭配位元組順序。
  • utf7 使用UTF-7。
  • utf8 使用UTF-8。
  • utf32 使用UTF-32搭配位元組順序。
類型:String
接受的值:ASCII, BigEndianUnicode, Default, OEM, Unicode, UTF7, UTF8, UTF32
Position:Named
預設值:Default
必要:False
接受管線輸入:False
接受萬用字元:False

-Exclude

排除指定的專案。 此參數的值會限定 path 參數。 輸入路徑專案或模式,例如 *.txt。 允許通配符。

類型:String[]
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:True

-Include

包含指定的專案。 此參數的值會限定 path 參數。 輸入路徑專案或模式,例如 *.txt。 允許通配符。

類型:String[]
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:True

-InputObject

指定要搜尋的文字。 輸入包含文字的變數,或輸入取得文字的命令或表達式。

使用 InputObject 參數與將字串傳送至 Select-String相同。

當您使用管線將多個字串傳送至 Select-String Cmdlet 時,它會搜尋每個字串中的指定文字,並傳回包含搜尋文字的每個字串。

當您使用 InputObject 參數來提交字串集合時,Select-String 會將集合視為單一合併字串。 如果字串在任何字串中尋找搜尋文字,Select-String 會以單位傳回字串。

類型:PSObject
Position:Named
預設值:None
必要:True
接受管線輸入:True
接受萬用字元:False

-List

每個輸入檔只會傳回相符文字的第一個實例。 這是擷取具有符合正則表達式內容的檔案清單最有效率的方式。

根據預設,Select-String 會針對所找到的每個相符項目傳回 MatchInfo 物件。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-LiteralPath

指定要搜尋之檔案的路徑。 LiteralPath 參數的值會與類型完全相同。 不會將任何字元解譯為通配符。 如果路徑包含逸出字元,請以單引弧括住它。 單引號會告知PowerShell不要將任何字元解譯為逸出序列。 如需詳細資訊,請參閱 about_Quoting_Rules

類型:String[]
別名:PSPath
Position:Named
預設值:None
必要:True
接受管線輸入:True
接受萬用字元:False

-NotMatch

NotMatch 參數會尋找不符合指定模式的文字。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Path

指定要搜尋之檔案的路徑。 允許通配符。 預設位置是本機目錄。

指定目錄中的檔案,例如 log1.txt*.doc*.*。 如果您只指定目錄,命令會失敗。

類型:String[]
Position:1
預設值:Local directory
必要:True
接受管線輸入:True
接受萬用字元:True

-Pattern

指定要在每個行上尋找的文字。 模式值會被視為正則表達式。

若要瞭解正規表示式,請參閱 about_Regular_Expressions

類型:String[]
Position:0
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-Quiet

指出 Cmdlet 會傳回簡單的回應,而不是 MatchInfo 物件。 如果找到模式,則傳回的值會 $true,如果找不到模式,則為 $null

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-SimpleMatch

指出 Cmdlet 使用簡單比對,而不是正則表示式比對。 在簡單的比對中,Select-String 搜尋輸入中的 Pattern 參數中的文字。 它不會將 Pattern 參數的值解譯為正則表達式語句。

此外,使用 SimpleMatch 時,傳回 MatchInfo 物件的 Matchs 屬性是空的。

注意

當此參數與 AllMatches 參數搭配使用時,會忽略 AllMatches

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

輸入

PSObject

您可以使用管線將具有 ToString() 方法的任何物件傳送至此 Cmdlet。

輸出

MatchInfo

根據預設,此 Cmdlet 會針對找到的每個相符項目傳回 MatchInfo 物件。

Boolean

當您使用 Quiet 參數時,這個 Cmdlet 會傳回指出是否已找到模式的 布爾值 布爾值。

備註

Windows PowerShell 包含下列 Select-String別名:

  • sls

Select-String 類似於 Unix 中的 grep 或 Windows 中的 findstr.exe

注意

根據 PowerShell 命令 核准的動詞,Select-* Cmdlet 的官方別名前置詞是 sc,而不是 sl。 因此,Select-String 的適當別名應該 scs,而不是 sls。 這是此規則的例外狀況。

將物件傳送至 Select-String時:

  • FileInfo 物件會被視為檔案的路徑。 指定檔案路徑時,Select-String 搜尋檔案的內容,而不是物件的 ToString() 表示法。
  • 管道物件 ToString() 結果與 PowerShell 格式系統所產生的豐富字串表示不同。 因此,您可能需要使用管線將對象傳送至 Out-String。 如需詳細資訊,請參閱範例 10。

若要使用 Select-String,請輸入您想要尋找的文字作為 Pattern 參數的值。 若要指定要搜尋的文字,請使用下列準則:

  • 在引號字串中輸入文字,然後將它傳送至 Select-String
  • 將文字字串儲存在變數中,然後將變數指定為 inputObject 參數 的值。
  • 如果文字儲存在檔案中,請使用 Path 參數來指定檔案的路徑。

根據預設,Select-String 會將 Pattern 參數的值解譯為正則表達式。 如需詳細資訊,請參閱 about_Regular_Expressions。 您可以使用 SimpleMatch 參數來覆寫正則表示式比對。 SimpleMatch 參數會在輸入中尋找 Pattern 參數值的實例。

Select-String 的預設輸出是 MatchInfo 物件,其中包含相符專案的詳細資訊。 當您搜尋檔案中的文字時,物件中的資訊很有用,因為 MatchInfo 物件具有屬性,例如 FilenameLine。 當輸入不是來自檔案時,這些參數的值會 InputStream

如果您不需要 MatchInfo 物件 中的資訊,請使用 Quiet 參數。 Quiet 參數會傳回 Boolean 值 (True 或 False),指出它是否找到相符專案,而不是 MatchInfo 物件。

比對片語時,Select-String 會使用為系統設定的目前文化特性。 若要尋找目前的文化特性,請使用 Get-Culture Cmdlet。

若要尋找 matchInfo 物件的 屬性,請輸入下列命令:

Select-String -Path test.txt -Pattern 'test' | Get-Member | Format-List -Property *