「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()
✅ 実行方法
.ps1ファイルとして保存(例:SearchViewer.ps1)- PowerShell を開いて
.\SearchViewer.ps1を実行
※ 初回はスクリプト実行ポリシーを確認(必要ならSet-ExecutionPolicy RemoteSigned)
🔧 カスタマイズ例
| 機能追加 | 方法 |
|---|---|
| 除外ドメインを増やす | $blacklist 配列に追加 |
| ダークテーマにする | HTMLのCSS部分を変更 |
| Google検索に対応する | 検索URLを Google に変更(※要注意) |
| 検索結果をファイル保存する | $html を .html ファイルに保存 |
🚀 まとめ
PowerShellでここまでできるの?と思った人もいるかもしれません。
実は、System.Windows.Forms と WebBrowser コントロールを組み合わせるだけで、軽量な検索ビューアが作れてしまうんです。
ちょっとした検索フィルター付きビューアを作りたい人や、PowerShellでGUIを触ってみたい初心者の方にもオススメです!
気に入ったらブックマークやシェア、フォローしてくれると嬉しいです! 🙌
ご質問・改造アイデアなどもぜひコメントでどうぞ!