Microsoftのセキュリティパッチをダウンロードする

Microsoftのセキュリティパッチをダウンロードするスクリプトを作成しました。テキストファイルにダウンロードしたいセキュリティパッチのファイル名を記載しておき、スクリプトを実行します。すると、テキストファイルと同じフォルダにファイルがダウンロードされるという仕組みです。スクリプトの処理としては次のようにしました。

  1. Google検索を利用して、Microsoftのページ(ダウンロードをボタンが存在するページ)を取得
  2. 取得したページからセキュリティパッチのファイルのURLを取得
  3. URLを元にファイルをダウンロード

Googleのページには、「Google 検索」ボタンと「I'm Feeling Lucky」ボタンがあります。「I'm Feeling Lucky」ボタンを押した場合は、検索結果を表示せず、最も適したサイトに移動してくれます。また、サイト内検索というものもあります。検索文字列の最後に「site:<検索したいサイトのURL>」を指定することで、指定したサイト内での検索結果を返してくれます。今回はこれを利用しました。スクリプトの内容を以下です。

[void][reflection.assembly]::LoadWithPartialName("System.Web")

$ParentPath  = split-Path -Parent $MyInvocation.MyCommand.Path;
$PatchList= $ParentPath + "\" + "patchList.txt";
$SearchURL = "http://www.google.co.jp/search";
$Site = "http://www.microsoft.com/downloads";
$enc = [system.Text.Encoding]::GetEncoding("utf-8");

# webclientオブジェクトの生成
$wc = new-Object system.Net.WebClient;

# パッチリストの行数分まわす
get-Content $PatchList | foreach-Object{

    # 検索文字列設定
    $SearchStr = $_ + " site:" + $Site;

    # URLエンコード設定
    $urlenc = [system.Web.HttpUtility]::UrlEncode($SearchStr,$enc);
    
    # クエリ文字列設定
    $nvc = new-Object system.Collections.Specialized.NameValueCollection;
    $nvc.Add("hl", "ja");
    $nvc.Add("q", $urlenc);
    $nvc.Add("lr", "");
    $nvc.Add("btnI","I'm+Feeling+Lucky");
    $wc.QueryString = $nvc;
    
    # Microsoftダウンロードページを取得
    $result = $wc.downloaddata($SearchURL);
    $html = $enc.getstring($result);

    # 実行ファイルを検索し、対象URLをダウンロード
    $p = "http://download.microsoft.com/download/.*?" + "/" + $_ + "(?=')";
    if ($html -match $p){
        foreach ( $FileURL in $matches.values){};
        $DownFileName = $ParentPath + "\" + $_;
        $wc.downloadfile($FileURL, $DownFileName);
        $mes = "ダウンロード…" + $_;
        write-Host $mes;
    }
    $nvc.clear();
}
$wc.dispose();
read-host "終了";

実行するには、まずテキストファイルにセキュリティパッチのファイル名を記載します。

次にスクリプトを実行します。

すると、ちゃんとダウンロードされたみたいです。