2016-05-26 10 views
1

検索する必要がある500文字以上の文字列のリストがあります。 (URLは重要ですが)私は1,000以上のWebページを持つWebサイトを持っています。私は、それぞれのWebページを検索して、それぞれがリンクしているURLを探したいと思います。複数のファイルを複数の文字列で検索する方法

私たちのWebサイトが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を新しい場所に移動する予定であるため、1,000以上のウェブページのリンクを手動で更新する必要があります)。

おそらく論理は次のようなものになります。

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

Webページがコンテンツ管理システムにあるため、検索/置換を直接行うことはできません。私たちができることは、どのページを更新する必要があるのか​​(ローカルドライブ上のWebページの静的なコピーを使用して)を見つけてから、CMSの個々のページを手動で更新するだけです。

私はこれがやりやすいと思っていますが、PowerShellの使い慣れていないことはどこから始めるのか分かりません。どんな助けでも大歓迎です!

更新

助けを借りてくれたTravis Plunkに感謝します!彼の答えに基づいて、ここで私が使用するコードの最終バージョンがあります。

# 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

を、あなたはエンドをスクレイピングしていますユーザーが見ることができるページ( 'body'のみのようなもの)または完全なHTMLコンテンツそのもの? ((編集:これは重要なのは、完全な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' 

あなたは、行全体を印刷するには、 `選択オブジェクトを」ステートメントにlineを追加することができます

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 

出力例。

$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

これはトリックを行うように見えます!私は変更を加える必要がありました(あなたのバージョンは行番号と行を表示していましたが、検索したい文字列が欲しかったのですが)。質問の最終版を編集します。ありがとう! –

関連する問題