2015-03-23 6 views
0

Я хочу искать файлы в папке и находить следующие строки в каждом файле, и я хочу вывести его в файл. Я хотел бы найти комбинацию из двух строк в файлах независимо от того, как она записана в файле. Я должен был бы найти эту комбинацию строк, даже если возврат каретки существует в середине этих двух строк.Найти комбинации двух строк в нескольких файлах

Вот код, который я до сих пор:

$Path = "C:\Promotion\Scripts" 
$txt_string1 = "CREATE" 
$txt_string2 = "PROC" 
$PathArray = @() 
$Results = "C:\Promotion\Errors\Deployment_Errors.txt" 

# This code snippet gets all the files in $Path that end in ".sql". 
Get-ChildItem $Path -Filter "*.sql" | 
    Where-Object { $_.Attributes -ne "Directory"} | 
    ForEach-Object { 
     If (Get-Content $_.FullName | Select-String -Pattern $txt_string2) { 
     $PathArray += $_.FullName 
     } 
    } 

$PathArray | ForEach-Object {$_} | Out-File $Results 

ответ

0

для поиска более одной строки в текстовом файле, вы должны использовать как этот метод

"hello","guy","hello guy" | Select-String -Pattern '(hello.*guy)|(guy.*hello)' 

результат:

hello guy 

после того, как вы найдете строки, вы хотите получить файл вот так:

"hello","guy","hello guy" | Select-String -Pattern '(hello.*guy)|(guy.*hello)' | Out-File -FilePath c:\test.txt 

теперь мы видим в test.txt

PS C:\> Get-Content test.txt 

hello guy 
0

Вы можете сделать это без петель. Определите комбинации двух ваших поисковых терминов в качестве альтернатив в регулярном выражении с поддержкой многострочной поддержки ((?ms)).

$basepath = 'C:\Promotion\Scripts' 
$results = 'C:\Promotion\Errors\Deployment_Errors.txt' 

$term1 = 'CREATE' 
$term2 = 'PROC' 
$pattern = "(?ms)($term1.*$term2|$term2.*$term1)" 

Get-ChildItem "$basepath\*.sql" | 
    ? { Get-Content $_.FullName -Raw | Select-String -Pattern $pattern } | 
    select -Unique -Expand FullName | 
    Out-File $results 

Обратите внимание, что это не будет сообщать о любой файл, который содержит оба термина в любом месте в нем, независимо от того, что другой текст между ними. Если вы хотите, чтобы найти только те файлы, которые содержат комбинации этих двух терминов либо не разделенных (CREATEPROC или PROCCREATE) или отделенной ничего, кроме пробела, изменить шаблон для этого:

$pattern = "(?ms)($term1\s*$term2|$term2\s*$term1)" 

В зависимости от условий поиска также может быть хорошая идея избежать их, прежде чем создавать регулярное выражение, чтобы вы не получали нежелательные метасимволы (вряд ли с двумя строковыми литералами, которые у вас есть, но только для того, чтобы быть в безопасности):

$term1 = [regex]::Escape('CREATE') 
$term2 = [regex]::Escape('PROC') 
+0

для быстрого ответа Ансгара. Но сценарий по-прежнему не возвращается, когда термин CREATE и PROC находится на двух разных строках, сценарий, который вы предоставили выше, работает только в том случае, если термины CREATE и PROC находятся в одной строке в файле. И я хочу, чтобы сценарий powershell идентифицировал файлы, где термины CREATE и PROC находятся рядом друг с другом, независимо от того, находятся ли они оба в одной строке или в разных строках в файле, если эти два термина следуют друг за другом сразу после другого он должен отображаться в выходном файле результатов. –

+0

@PavanSanthanam. По-видимому, 'Select-String' обрабатывает входные файлы по строкам, поэтому многострочное совпадение не будет работать. Вам нужно прочитать весь контент файла как одну строку и передать его в 'Select-String'. См. Обновленный ответ. –

Смежные вопросы