PowerShellで検索する時代へ!軽量ビューアを5分で自作してみた

「PowerShellって黒い画面のコマンドラインだけでしょ?」

そう思っていませんか?
実はPowerShellでもGUIアプリが作れます。
しかも、ちょっと手を加えるだけで「検索フォーム付きのWeb風ビューア」まで作れちゃうんです!

今回は、Edgeと連携してリンクを開ける検索ビューアアプリをPowerShellで作成したので、ソースコードとともに紹介します。


🔍 このアプリでできること

  • GUI上で検索ワードを入力
  • Bingで検索 → 結果を整形して一覧表示(タイトル+説明文)
  • リンクをクリックすると Edge で開く
  • 除外したいドメインを指定可能(例:Wikipediaなど)
  • 検索欄&検索ボタンは常時表示 → 何度でも再検索OK
  • Enterキーでも検索可能

🧑‍💻 PowerShellのコード全文

以下のコードを .ps1 ファイルとして保存し、PowerShellで実行するだけで動作します。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$blacklist = @("wikipedia.org", "example.com")  # 除外ドメイン

# フォーム設定
$form = New-Object System.Windows.Forms.Form
$form.Text = "検索ビューア"
$form.Size = New-Object System.Drawing.Size(1000, 700)
$form.BackColor = [System.Drawing.Color]::FromArgb(245, 245, 245)
$form.StartPosition = "CenterScreen"
$form.MinimumSize = New-Object System.Drawing.Size(600, 400)

# パネル(検索UI)
$topPanel = New-Object System.Windows.Forms.Panel
$topPanel.Size = New-Object System.Drawing.Size(980, 50)
$topPanel.Location = New-Object System.Drawing.Point(10, 10)
$topPanel.Anchor = "Top,Left,Right"

# 検索ボックス
$searchBox = New-Object System.Windows.Forms.TextBox
$searchBox.Size = New-Object System.Drawing.Size(700, 30)
$searchBox.Location = New-Object System.Drawing.Point(0, 10)
$searchBox.Font = New-Object System.Drawing.Font("Segoe UI", 12)

# 検索ボタン
$searchButton = New-Object System.Windows.Forms.Button
$searchButton.Text = "検索"
$searchButton.Size = New-Object System.Drawing.Size(100, 30)
$searchButton.Location = New-Object System.Drawing.Point(720, 10)
$searchButton.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold)
$searchButton.BackColor = [System.Drawing.Color]::FromArgb(30, 144, 255)
$searchButton.ForeColor = "White"
$searchButton.FlatStyle = "Flat"
$searchButton.FlatAppearance.BorderSize = 0

$topPanel.Controls.Add($searchBox)
$topPanel.Controls.Add($searchButton)

# Webブラウザ(結果表示)
$browser = New-Object System.Windows.Forms.WebBrowser
$browser.Location = New-Object System.Drawing.Point(10, 70)
$browser.Size = New-Object System.Drawing.Size(960, 580)
$browser.Anchor = "Top,Bottom,Left,Right"

# Edgeでリンクを開く
$browser.add_Navigating({
    param($sender, $e)
    $url = $e.Url.ToString()
    if ($url -like "http*") {
        $e.Cancel = $true

        $edgePath = "$env:ProgramFiles (x86)\Microsoft\Edge\Application\msedge.exe"
        if (-not (Test-Path $edgePath)) {
            $edgePath = "$env:ProgramFiles\Microsoft\Edge\Application\msedge.exe"
        }

        if (Test-Path $edgePath) {
            Start-Process $edgePath $url
        } else {
            [System.Windows.Forms.MessageBox]::Show("Edge が見つかりませんでした。")
        }
    }
})

# 検索実行処理
$searchAction = {
    $keyword = $searchBox.Text
    if (-not $keyword) { return }

    $encoded = [uri]::EscapeDataString($keyword)
    $searchUrl = "https://www.bing.com/search?q=$encoded"

    try {
        $response = Invoke-WebRequest -Uri $searchUrl -Headers @{
            "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
        }

        $htmlDoc = $response.ParsedHtml
        $results = $htmlDoc.getElementsByTagName("li")

        $html = @"
<html>
<head>
<style>
    body { font-family: 'Segoe UI'; background-color: #ffffff; padding: 20px; color: #333; }
    h2 { color: #1a73e8; }
    a { text-decoration: none; color: #1a0dab; font-size: 16px; }
    a:hover { text-decoration: underline; }
    ul { padding-left: 20px; }
    li { margin-bottom: 18px; }
    span { display: block; color: #555; margin-top: 4px; font-size: 14px; }
</style>
</head>
<body>
<h2>検索結果: $keyword</h2>
<ul>
"@

        foreach ($item in $results) {
            if ($item.className -eq "b_algo") {
                try {
                    $h2s = $item.getElementsByTagName("h2")
                    $links = $item.getElementsByTagName("a")
                    $ps = $item.getElementsByTagName("p")

                    if ($h2s.length -gt 0 -and $links.length -gt 0) {
                        $title = $h2s.item(0).innerText
                        $link = $links.item(0).href
                        $desc = ""
                        if ($ps.length -gt 0) {
                            $desc = $ps.item(0).innerText
                        }

                        $skip = $false
                        foreach ($b in $blacklist) {
                            if ($link -like "*$b*") { $skip = $true; break }
                        }

                        if (-not $skip) {
                            $html += "<li><a href='$link'><strong>$title</strong></a><br><span>$desc</span></li>`n"
                        }
                    }
                } catch {}
            }
        }

        $html += "</ul></body></html>"
        $browser.DocumentText = $html
    } catch {
        $err = $_.Exception.Message
        $browser.DocumentText = "<html><body><p style='color:red;'>検索失敗: $err</p></body></html>"
    }
}

# イベント登録
$searchButton.Add_Click($searchAction)
$searchBox.Add_KeyDown({
    if ($_.KeyCode -eq "Enter") {
        &$searchAction.Invoke()
    }
})

# フォームに追加
$form.Controls.Add($topPanel)
$form.Controls.Add($browser)

# 実行
$form.ShowDialog()

✅ 実行方法

  1. .ps1 ファイルとして保存(例:SearchViewer.ps1
  2. PowerShell を開いて .\SearchViewer.ps1 を実行
    ※ 初回はスクリプト実行ポリシーを確認(必要なら Set-ExecutionPolicy RemoteSigned

🔧 カスタマイズ例

機能追加方法
除外ドメインを増やす$blacklist 配列に追加
ダークテーマにするHTMLのCSS部分を変更
Google検索に対応する検索URLを Google に変更(※要注意)
検索結果をファイル保存する$html.html ファイルに保存

🚀 まとめ

PowerShellでここまでできるの?と思った人もいるかもしれません。
実は、System.Windows.FormsWebBrowser コントロールを組み合わせるだけで、軽量な検索ビューアが作れてしまうんです。

ちょっとした検索フィルター付きビューアを作りたい人や、PowerShellでGUIを触ってみたい初心者の方にもオススメです!


気に入ったらブックマークやシェア、フォローしてくれると嬉しいです! 🙌
ご質問・改造アイデアなどもぜひコメントでどうぞ!

スポンサーリンク

-IT関連
-,