2021-01-25

Select-String:命令的結果

傳回MatchInfo物件
-NotMatch 參數
-List 參數
-Quiet 參數
-Context 參數
-AllMatches 參數
取得字串陣列
PS R:\> $arrFullName = (dir *.jpg).FullName
PS R:\> $arrFullName
R:\1.jpg
R:\2.jpg
R:\3.jpg
R:\4.jpg
R:\5.jpg
PS R:\>

傳回MatchInfo物件

有幾個(or 幾行)符合,就傳回幾個MatchInfo物件
PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg'

R:\2.jpg
R:\3.jpg


PS R:\> $r = $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg'
PS R:\> $r.Count
2
PS R:\>
傳回一個物件
PS R:\> $r = $arrFullName | Select-String -Pattern '2\.jpg'
PS R:\> $r.gettype().name
MatchInfo
PS R:\> $r.Line
R:\2.jpg
PS R:\> $r[0].Line
R:\2.jpg
PS R:\>
傳回二個物件
PS R:\> $r = $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg'
PS R:\> $r.Count
2
PS R:\> $r.gettype().name
Object[]
PS R:\> $r[0].gettype().name
MatchInfo
PS R:\> $r.Line
R:\2.jpg
R:\3.jpg
PS R:\> $r[0].Line
R:\2.jpg
PS R:\> $r[1].Line
R:\3.jpg
PS R:\>

-NotMatch 參數

反向選擇
PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg' -NotMatch

R:\1.jpg
R:\4.jpg
R:\5.jpg


PS R:\> $r = $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg' -NotMatch
PS R:\> $r.Count
3
PS R:\>

-List 參數

預設:列出每一個符合的行
PS R:\> Select-String -Pattern 'b','c' -Path *.txt

1.txt:2:bbb
1.txt:3:ccc
2.txt:2:bbb


PS R:\>
-List:每個檔案只列出一次(第一個符合的行)
PS R:\> Select-String -Pattern 'b','c' -Path *.txt -List

1.txt:2:bbb
2.txt:2:bbb


PS R:\>
-List適用於:資料來源是檔案
資料來源不是檔案,不受影響
PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg'

R:\2.jpg
R:\3.jpg


PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg' -List

R:\2.jpg
R:\3.jpg


PS R:\>

-Quiet 參數

傳回 $true 或 $false
PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg' -Quiet
True
PS R:\>
-Quiet -List (最多只傳回一個MatchInfo)
PS R:\> $arrFullName | Select-String -Pattern '2\.jpg','3\.jpg' -Quiet -List

R:\2.jpg


PS R:\> Select-String -Pattern 'b','c' -Path *.txt -Quiet -List

1.txt:2:bbb


PS R:\>

-Context 參數

保留上下2行
PS R:\> $arrFullName | Select-String -Pattern '3\.jpg' -Context 2

  R:\1.jpg
  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg


PS R:\>
保留上1行、下2行
PS R:\> $arrFullName | Select-String -Pattern '3\.jpg' -Context 1,2

  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg


PS R:\>
不會因為保留上下行,而多傳回物件
PS R:\> $r = $arrFullName | Select-String -Pattern '3\.jpg' -Context 1,2
PS R:\> $r.count
1
PS R:\> $r.gettype().name
MatchInfo
保留上下行的資料,儲存在MatchInfo物件的Context屬性
PS R:\> $r.Context.PreContext
R:\2.jpg
PS R:\> $r.Context.PostContext
R:\4.jpg
R:\5.jpg
PS R:\>
MatchInfo → 一個字串
PS R:\> "$r"
  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg
PS R:\> $r | Out-String

  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg



PS R:\>
MatchInfo → 檔案
PS R:\> $r > a.txt
PS R:\> gc a.txt

  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg
PS R:\> (gc a.txt).Count
5
PS R:\>
MatchInfo | %{$_}
PS R:\> $r | %{$_; '=========='}

  R:\2.jpg
> R:\3.jpg
  R:\4.jpg
  R:\5.jpg
==========

$r是一個物件,只傳進管線一次
PS R:\>
MatchInfo | Select-String
PS R:\> $r | Select-String -Pattern '.*'

> R:\3.jpg

不會讀取「保留的上下行」
PS R:\>
使用Line屬性,取得那一行內容 (最前面沒有 >)
PS R:\> $r | Select-String -Pattern '.*' -InputObject {$_.Line}

R:\3.jpg


PS R:\>

-AllMatches 參數

預設:每個符合行之內,只找第一個符合處
PS R:\> $s = 'a12345------a789'
PS R:\> $s | Select-String -Pattern 'a\d+'

a12345------a789


PS R:\> $r = $s | Select-String -Pattern 'a\d+'
PS R:\> $r.Count
1
PS R:\> $r.Matches


Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 0
Length   : 6
Value    : a12345



PS R:\>
每個符合行之內,找到每個符合處
仍然:「一個符合行,只傳回一個MatchInfo」
PS R:\> $r = $s | Select-String -Pattern 'a\d+' -AllMatches
PS R:\> $r.Count
1
PS R:\> $r.Matches


Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 0
Length   : 6
Value    : a12345

Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 12
Length   : 4
Value    : a789



PS R:\>

沒有留言:

張貼留言