2017-07-30 135 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"}