2017-07-30 183 views
2

我試圖找到文件回車(\r)和新線(\n),但下面的兩個語句返回任何內容:轉義字符

Get-ChildItem -recurse | Select-String -pattern "\r" | group path | select name 
Get-ChildItem -recurse | Select-String -pattern "\n" | group path | select name 

然而,標籤(\t)轉義字符似乎工作:

Get-ChildItem -recurse | Select-String -pattern "\t" | group path | select name 

回答

6

Select-String個別線路輸入文件默認情況下運行,並且因爲這些線路不包含色曲換行符在他們的最後,它不能被匹配。
換言之:在指定的正則表達式(-Pattern)與每個輸入行相匹配時,換行符(換行符)默認爲,並被剝離

您必須因此讀取每個輸入文件整體以匹配其換行符序列,這Get-Content -Raw(PSv3 +)允許你這樣做:

Get-ChildItem -Recurse -File | ForEach-Object { 
    if (Get-Content -Raw $_.FullName | Select-String -Quiet '\r') { $_.Name } 
} 

Select-String -Quiet停在第一個比賽,如果有的話,並返回布爾型,指示是否找到匹配項。

請注意,需要通過$_.FullName而不僅僅是$_Get-Content -Raw以確保不在當前目錄中的文件也得到正確處理。
其原因是$_,儘管是一個對象攜帶完整路徑信息,勢必作爲Get-Content-Path參數,該字符串是單純的文件名,沒有路徑信息。
這是一個known pitfall

0

短版:

gci -file -rec | ? { (gc $_.FullName -Raw) -match "\n"}