PowerShellで簡易キーボードマクロを作成する
0.キーボード操作を自動化したい
職場でテストや定型作業の効率化のためにキーボード操作を自動化したいとき、キーボードマクロ機能を持つソフトウェアをインストールできればよいのですが、セキュリティ上の理由でインストールが禁止されているケースも多いかと思います。
そのような場合、PowerShellでスクリプトを組めばWindows標準機能のみでキーボード操作を自動化できます。
以下、普段あまりPowerShellを利用しない方向けの「(ほぼ)コピペのみで簡易キーボードマクロを作成する手順」です。
※この記事は Windows11 かつ PSVersion5.1 で動作確認しています
1.基礎編:メモ帳に文字列を自動入力するマクロ
まずは「メモ帳を起動してそこに指定の文字列を入力する」スクリプトを作成します。
1-1.スクリプトファイルの保存
以下のコードをメモ帳に貼り付けてください。
その後、拡張子を「ps1」に、文字コードを「ANSI」にして「(任意のファイル名).ps1」として保存してください。
※コード内ではファイル名を「inputIntoNotepad.ps1」としています
# Windowsフォームやキーボード操作を扱う機能を利用できるようにする。
add-type -AssemblyName System.Windows.Forms
# メモ帳(notepad)アプリを起動する。
notepad
# 1秒間(1000ミリ秒)スリープする。
# メモ帳が完全に起動するのを待つための待機時間。
Start-Sleep -m 1000
# キー入力をシミュレートして、
# 現在のウィンドウ(この場合はメモ帳)に入力する。
[Windows.Forms.SendKeys]::SendWait("この文字列は自動で入力しています。")
[Windows.Forms.SendKeys]::SendWait("{Enter}")
[Windows.Forms.SendKeys]::SendWait("成功すればメモ帳に文字列が表示されます。")
1-2.PowerShellスクリプトの実行
先ほどps1ファイルを保存したフォルダを開きます。
Shift + 右クリックから「PowerShellウィンドウをここで開く」を選択してPowerShellを起動します。
その後、起動したPowerShellウィンドウ内に以下のコードをコピペしてps1ファイルを実行してください。
※デフォルトの設定ではPowerShellスクリプトが実行できないので、今回のプロセスに限り実行できるようコード内でPowerShell実行ポリシーを変更しています
# 現在の実行ポリシーを取得する。
Get-ExecutionPolicy -List
# このプロセスでのみPowerShellスクリプトを実行できるように
# 実行ポリシーを変更する。
Set-ExecutionPolicy RemoteSigned -Scope Process
# 実行ポリシーを毎回変更するのが手間であれば
# スコープをプロセスではなくユーザにすれば以降は変更不要。
# Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 実行ポリシーの変更が反映されていることを確認する。
Get-ExecutionPolicy -List
# 先ほど保存したスクリプトを実行する。
./inputIntoNotepad.ps1
成功すればメモ帳に以下のように表示されるはずです。
2.発展編:Webサイトのフォームを自動入力する
ここまではメモ帳に対してキーボード操作を実行しましたが、
もちろん任意のウィンドウに対してキーボード操作を行うことも可能です。
サンプルとしてGoogleの詳細検索にある項目を自動入力するスクリプトを作成します。
画像で見えている範囲を対象とします。
2-1.スクリプトファイルの保存
基礎編同様、以下のコードをメモ帳に貼り付けてください。
その後、拡張子を「ps1」に、文字コードを「ANSI」にして「(任意のファイル名).ps1」として保存してください。
※コード内ではファイル名を「inputIntoSearch.ps1」としています
# Windowsフォームやキーボード操作を扱う機能を利用できるようにする。
add-type -AssemblyName System.Windows.Forms
# 10秒間(10000ミリ秒)スリープする。
Start-Sleep -m 10000
# 検索条件にデータを入力する。
# すべてのキーワードを含む
[Windows.Forms.SendKeys]::SendWait("テリア トライカラー")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 語順も含め完全一致
[Windows.Forms.SendKeys]::SendWait("ヨークシャー テリア")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# いずれかのキーワードを含む
[Windows.Forms.SendKeys]::SendWait("小型 OR 中型")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 含めないキーワード
[Windows.Forms.SendKeys]::SendWait("-紅茶")
[Windows.Forms.SendKeys]::SendWait(" ")
[Windows.Forms.SendKeys]::SendWait("-ジャック ラッセル")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 数値の範囲(始)
[Windows.Forms.SendKeys]::SendWait("5")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 数値の範囲(終)
[Windows.Forms.SendKeys]::SendWait("15kg")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 言語
[Windows.Forms.SendKeys]::SendWait("{DOWN}{DOWN}{ENTER}")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 地域
[Windows.Forms.SendKeys]::SendWait("{UP}{DOWN}{DOWN}{ENTER}")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 最終更新
[Windows.Forms.SendKeys]::SendWait("{DOWN}{UP}{DOWN}{ENTER}")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# サイトまたはドメイン
[Windows.Forms.SendKeys]::SendWait(".org")
[Windows.Forms.SendKeys]::SendWait("{TAB}")
# 検索対象の範囲
[Windows.Forms.SendKeys]::SendWait("{DOWN}{DOWN}{ENTER}")
2-2.PowerShellスクリプトの実行
今回はメモ帳ではなくブラウザに対してスクリプトを実行する必要があるので、上記URLより検索条件の画面を開いておいてください。
その後、こちらも基礎編同様に先ほどps1ファイルを保存したフォルダを開きます。
Shift + 右クリックから「PowerShellウィンドウをここで開く」を選択してPowerShellを起動します。
その後、起動したPowerShellウィンドウ内に以下のコードをコピペしてps1ファイルを実行してください。
※デフォルトの設定ではPowerShellスクリプトが実行できないので、今回のプロセスに限り実行できるようコード内でPowerShell実行ポリシーを変更しています
注意点として、ps1ファイルの実行後、処理が開始されるまでの10秒間で自力で画面を操作して「すべてのキーワードを含む」のリストボックスにフォーカスを当ててください。
フォーカスを当てたらあとは10秒経過後の実行を待つのみです。
# 現在の実行ポリシーを取得する。
Get-ExecutionPolicy -List
# このプロセスでのみPowerShellスクリプトを実行できるように
# 実行ポリシーを変更する。
Set-ExecutionPolicy RemoteSigned -Scope Process
# 実行ポリシーの変更が反映されていることを確認する。
Get-ExecutionPolicy -List
# 先ほど保存したスクリプトを実行する。
./inputIntoSearch.ps1
成功すれば、以下のように空欄だった検索条件が
以下のように入力されるはずです。
あとは上記のスクリプトをご自身の目的に合わせてカスタマイズしてみてください。
2-3.SendKeysで入力できる内容について
TABキーや矢印キーなどの特殊キーや、AltキーまたはShiftキーとの同時押しも入力可能です。
詳細は以下のサイトを参考にしてください。
注意点として、SPACEキーの入力を再現する場合は
[Windows.Forms.SendKeys]::SendWait("{SPACE}")
ではなく
[Windows.Forms.SendKeys]::SendWait(" ")
と記述してください。
Discussion