2017-07-30 1 views
2

J'essaie de trouver le retour chariot (\r) et nouvelle ligne (\n) dans les fichiers, mais les deux instructions suivantes renvoient rien:caractère de recherche de fuite dans les fichiers

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

Cependant, l'onglet (\t) caractère d'échappement semble fonctionner:

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

Répondre

6

Select-String fonctionne sur lignes individuelles des fichiers d'entrée par défaut, et que ces lignes ne contiennent pas la nouvelle ligne Sequ à leur fin, il ne peut pas être égalé. En d'autres termes, les séquences de retour à la ligne (sauts de ligne) ont été déshabillées par défaut au moment où l'expression régulière spécifiée (-Pattern) est comparée à chaque ligne d'entrée.

Vous devez lire chaque fichier d'entrée comme ensemble afin de faire correspondre ses séquences de saut de ligne, qui Get-Content -Raw (PSV3 +) vous permet de faire:

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

Select-String -Quiet arrêts au 1er match le cas échéant et renvoie un booléen indiquant si une correspondance a été trouvée ou non.

Notez la nécessité de passer $_.FullName plutôt que simplement $_ à Get-Content -Raw pour vous assurer que les fichiers qui ne sont pas dans le répertoire en cours sont également traités correctement.
La raison est que $_, en dépit d'être un objet qui transporte une information complète de chemin, est lié comme une chaîne au paramètre de -PathGet-Content, et cette chaîne est le seul fichier nom, sans informations de chemin.
Ceci est un known pitfall.

0

version courte:

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