2016-05-26 4 views
1

У меня есть список из более чем 500 строк, которые мне нужно найти. (Это URL-адреса, если это имеет значение.) У меня есть веб-сайт с более чем 1000 веб-страницами. Я хочу искать на каждой из этих веб-страниц, чтобы найти, к каким URL-адресам привязаны ссылки.Как искать несколько файлов для нескольких строк

Назад, когда наш веб-сайт был в ящике Unix, я бы написал небольшой скрипт оболочки, используя find и grep, чтобы выполнить это, но теперь мы на машине под Windows, так что это не вариант. У меня нет опыта работы с PowerShell, но я подозреваю, что это то, что мне нужно. Однако я даже не знаю, как начать.

В идеале, я хотел бы в конечном итоге с что-то вроде этого:

<filename 1> 
    <1st string found> 
    <2nd string found> 
    <3rd string found> 
<filename 2> 
    <1st string found> 
    <2nd string found> 

мне не нужно знать номер строки; Мне просто нужно знать, какие URL-адреса находятся в файлах. (Мы собираемся переместить все 500 + целевых URL-адресов в новые местоположения, поэтому нам придется вручную обновлять ссылки на 1000+ веб-страницах. Это будет королевская боль.)

Предположительно, логика будет что-то вроде этого:

for each file { 
    print the filename 
    for each string { 
     if string found in file { 
      print the string 
     } 
    } 
} 

Мы не можем сделать поиска/замены непосредственно, так как веб-страницы находятся в системе управления контентом. Все, что мы можем сделать, это определить, какие страницы необходимо обновить (используя статическую копию веб-страниц на локальном диске), а затем вручную обновить отдельные страницы в CMS.

Я надеюсь, что это легко сделать, но мое полное незнание с PowerShell означает, что я понятия не имею, с чего начать. Любая помощь будет принята с благодарностью!

Update

Благодаря Travis шлепнуть за помощь! Основываясь на его ответе, вот окончательная версия кода, который я буду использовать.

# Strings to search for 
$strings = @(
    'http://www.ourwebsite.com/directory/somefile.pdf' 
    'http://www.ourwebsite.com/otherdirectory/anotherfile.pdf' 
    'http://www.otherwebsite.com/directory/otherfile.pdf' 
) 

# Directory containing web site files 
cd \OurWebDirectory 

$results = @(foreach($string in $strings) 
{ 
    Write-Host "Searching files for $string" 
    # Excluding the images directory 
    dir . -Recurse -Exclude \imagedir | Select-String -SimpleMatch $string 
}) | Sort-Object -Property path 

$results | Group-Object -Property path | %{ 
    "File: $($_.Name)" 
    $_.Group | %{"`t$($_.pattern)"} 
} 
+0

Итак, вы выскабливание КОНЦА видимая страница пользователя (как это будет выглядеть, т. е. только «тело») или полное содержимое HTML-содержимого? ((EDIT: Это важно, потому что нам нужно сохранить полный HTML и искать во всех полях 'href', например)). – gravity

+0

[Findstr] (https://technet.microsoft.com/en-us/library/bb490907.aspx)? – n00dl3

+0

У меня есть локальный доступ к файлам для файлов HTML, поэтому не требуется очистка экрана или сканирование в Интернете. –

ответ

2

Это очень близко к тому, что вы хотите.

# Strings to search for 
$strings = @(
    'string1' 
    'string2' 
    ) 

$results = @(foreach($string in $strings) 
    { 
     # Be sure to update path to search and file search pattern 
     dir .\testdir\*.* -Recurse | Select-String -SimpleMatch $string 
    } 
) | Sort-Object -Property path 

$results | Select-Object 'path', 'pattern', 'LineNumber' 

Пример вывода

Path        Pattern LineNumber 
----        ------- ---------- 
C:\Users\travi\testdir\test1.txt string1   1 
C:\Users\travi\testdir\test1.txt string2   2 
C:\Users\travi\testdir\test2.txt string1   2 
C:\Users\travi\testdir\test2.txt string2   1 

Вы можете добавить line к `Select-Object высказыванием», чтобы напечатать всю строку.

Чтобы получить выход немного больше нравится то, что вы просили этот код, чтобы напечатать результаты:

$results | Group-Object -Property path | %{ 
    "File: $($_.Name)" 
    $_.Group | %{"`t$($_.linenumber):$($_.line)"} 
} 

даст такой вывод:

File: C:\Users\travi\testdir\test1.txt 
    1:string1 
    2:string2 
File: C:\Users\travi\testdir\test2.txt 
    2:string1 
    1:string2 
+0

Это выглядит многообещающе! Я попробую сегодня и дам вам знать, как это происходит. Благодаря! –

+0

Похоже, это будет трюк!Мне нужно было внести изменения (ваша версия показывала номер строки и строку, в то время как я хотел, была строка, которую искали), но я подумал об этом, так что похоже, что мы хороши! Я отредактирую свой вопрос с окончательной версией кода. Благодаря! –

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