VBScript、Windows Script Host (WSH) は無料でWindows標準で動作するスクリプトなので、長年愛用していたスクリプト言語。
過去のブログでも幾つも記事が見つかる。
- パワーポイント上の図形に自動的に色を塗る方法(VBA、VBScript)
- VBSからChrome経由で自動ログイン方法と、EXE化、アイコン変更方法
- VBScriptのスクリプトをアイコン変更してEXEとして公開
- テニスコートの自動キャンセル確認&予約システム
- MarketspeedⅡ 楽天RSS &Excelで自動売買を調査(基礎編)
しかし Microsoftは、2024年5月22日に公開されたMicrosoftの公式ブログおよびドキュメントで VBScriptおよびその実行環境であるWindows Script Host (WSH)の廃止を段階的に進める計画を発表してしまった。
色々と変わりすぎ……。
デジタル世界の制作物は短命。自分が死んだら100年後に動作しているサービスは無さそうだね。
木簡で残すか……。
一応、公式文章によると廃止に対してフェーズ1~3まで用意してあるらしい。
フェーズ1(2024年後半)
Windows 11 バージョン24H2以降、VBScriptはオンデマンド機能(FOD)として提供され、デフォルトで有効かつプリインストールさる。この段階では、既存のVBScript依存アプリケーションは影響を受けない。
フェーズ2(2027年頃)
VBScript FODがデフォルトで無効化される。VBScriptを使用する場合は、ユーザーが手動で「設定」→「システム」→「オプション機能」から有効化する必要がある。この時点で依存関係の移行が推奨される。
フェーズ3(時期未定)
VBScriptはWindowsから完全に削除され、関連するすべてのダイナミックリンクライブラリ(.dllファイル)が削除される。VBScript依存のアプリケーションやスクリプトは動作しなくなる。
因みに、HTML Application (HTA) はどうなるのだろう?

JScript(MicrosoftのJavaScript実装)もWSHでサポートされているので、JScriptの将来性についても非推奨化リスクが存在する可能性があるよね。
コード量も小さく良い題材なので、このティッカーをベースに置き換え方法を検討してみる。
代替手段は何になるのか?
Grok AIに聞いたら次の回答を得た。
代替手段 | 特徴 | 推奨シナリオ |
---|---|---|
PowerShell | Windowsに標準搭載 高機能で柔軟なスクリプト作成が可能 セキュリティ強化 |
Windows環境でのタスク自動化 サーバー管理 グループポリシーやスケジュールタスク |
JavaScript (Node.js) | クロスプラットフォーム対応 豊富なライブラリとコミュニティ 高速 |
Classic ASPからの移行 モダンなWebアプリケーション開発 |
JavaScript | 主要ブラウザ全てで動作 標準化(ECMAScript) 豊富なフレームワーク |
Internet Explorer依存のVBScriptを置き換えるWebページの動的処理 |
Python | 簡単な文法 豊富なライブラリ Windowsに標準搭載されていない |
クロスプラットフォームのスクリプト データ処理やAI関連タスク |
Visual Basic for Applications (VBA) |
Microsoft Officeで引き続きサポート VBScriptと類似の文法 |
OfficeマクロからのVBScript呼び出しの代替 短期的移行策 |
この中でもオススメは「PowerShell」。
Windows環境でのシステム管理に最適で、VBScriptの後継としてMicrosoftが強く推奨しているそうだ。
推奨の PowerShellでティッカーアプリを実装する
PowerShellは、Microsoftが開発した拡張可能なコマンドラインシェルとスクリプト言語。
Windowsのシステム管理やタスク自動化を効率的に行うために設計されており、WindowsだけでなくLinuxやmacOSでも利用可能。
では、早速 ティッカーアプリをPowerShellに置き換えてみる……ために
ChatGPT-4o様より御神託を賜わる
© 泡沫に神は微睡む/安田 のら/KADOKAWA
ほんとに ありがてぇ……ありがたいこった!
できたコードがこれ。PowerShellを扱うのが初めてなので中身がよく分かってない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# ニュースティッカーアプリ(PowerShell版・シンプル版) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Net.Http # フォームの作成 $form = New-Object System.Windows.Forms.Form $form.Text = "ニュースティッカー" $form.Width = 600 $form.Height = 30 # 30に変更 $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None $form.StartPosition = [System.Windows.Forms.FormStartPosition]::Manual $form.BackColor = [System.Drawing.Color]::FromArgb(51, 51, 51) $form.TopMost = $true # 画面の右下に配置 $screen = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea $form.Location = New-Object System.Drawing.Point(($screen.Right - $form.Width), ($screen.Bottom - $form.Height)) # 閉じるボタンの作成 $closeButton = New-Object System.Windows.Forms.Button $closeButton.Text = "x" $closeButton.Width = 20 $closeButton.Height = 20 $closeButton.Location = New-Object System.Drawing.Point(5, 7) $closeButton.BackColor = [System.Drawing.Color]::Red $closeButton.ForeColor = [System.Drawing.Color]::White $closeButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat $closeButton.FlatAppearance.BorderSize = 0 $closeButton.Add_Click({ $form.Close() }) $form.Controls.Add($closeButton) # ニュースラベルの作成 $newsLabel = New-Object System.Windows.Forms.Label $newsLabel.Location = New-Object System.Drawing.Point(30, 7) $newsLabel.Width = $form.Width - 40 $newsLabel.Height = 20 $newsLabel.ForeColor = [System.Drawing.Color]::White # フォントサイズを大きくする(ここを追加) $newsLabel.Font = New-Object System.Drawing.Font("メイリオ", 10, [System.Drawing.FontStyle]::Regular) $newsLabel.Text = "ニュースを読み込み中..." $form.Controls.Add($newsLabel) # ドラッグ機能の実装 $lastLocation = $null $dragging = $false $form.Add_MouseDown({ $script:lastLocation = $_.Location $script:dragging = $true }) $form.Add_MouseMove({ if ($script:dragging) { $form.Location = New-Object System.Drawing.Point( ($form.Location.X + $_.X - $script:lastLocation.X), ($form.Location.Y + $_.Y - $script:lastLocation.Y) ) } }) $form.Add_MouseUp({ $script:dragging = $false }) # RSSフィードからニュースを取得する関数 function Get-RssNews { $feeds = @( "http://www3.nhk.or.jp/rss/news/cat0.xml", "https://www.asahi.com/rss/asahi/newsheadlines.rdf" ) $allItems = @() $client = New-Object System.Net.Http.HttpClient foreach ($feed in $feeds) { try { $response = $client.GetStringAsync($feed).Result $xml = [xml]$response # フィードの形式によって異なるXMLパスを処理 if ($xml.rss) { $items = $xml.rss.channel.item } elseif ($xml.RDF) { $items = $xml.RDF.item } foreach ($item in $items) { $pubDate = $null # 日付の取得(フォーマットによって異なる) if ($item.pubDate) { try { $pubDate = [DateTime]$item.pubDate } catch { $pubDate = Get-Date } } elseif ($item.'dc:date') { try { $pubDate = [DateTime]$item.'dc:date' } catch { $pubDate = Get-Date } } else { $pubDate = Get-Date } $allItems += [PSCustomObject]@{ Title = $item.title Link = $item.link Date = $pubDate } } } catch { Write-Host ("Error fetching " + $feed + ": " + $_.Exception.Message) } } # 日付でソート return $allItems | Sort-Object -Property Date -Descending } # ニュースの表示を更新する $newsItems = Get-RssNews $currentIndex = 0 $timer = New-Object System.Windows.Forms.Timer $timer.Interval = 5000 # 5秒 $timer.Add_Tick({ if ($newsItems.Count -gt 0) { $item = $newsItems[$script:currentIndex] $newsLabel.Text = "$($item.Title) [$(($item.Date).ToString('HH:mm'))]" $script:currentIndex = ($script:currentIndex + 1) % $newsItems.Count } }) $timer.Start() # 定期的にニュースを更新 $updateTimer = New-Object System.Windows.Forms.Timer $updateTimer.Interval = 1200000 # 20分 $updateTimer.Add_Tick({ $script:newsItems = Get-RssNews $script:currentIndex = 0 }) $updateTimer.Start() # フォームを表示 [void]$form.ShowDialog() |
確かに実現できた。
おわりに
LLMに実装されたので簡単に実現できた。
細かい機能追加は徐々にやっていきたいが、最近はアイデアを形にするより既存サービスの延命ばかりしている気がする。
Windows 標準だから……と思ってVBScriptは使ってたんだけどな……結構大きなライブラリ作っちゃってるよ。
そう考えると PowerShell もいつまで使えるか分からないね。