『キーボードの入力を自動化したい』
そんなこと考えたりしませんか?
例えば、毎日のルーティンワーク。
ブラウザを起動して、
Webアプリにログインして、
エクスプローラーを開いて、
工程表を開いて、
開発用IDEを開いて。。。
これらはすべてPowerShellやbatでできますので、スタートアップにショートカットを登録しておくことで実現できます。
今回説明するのは、アプリへのログインの部分。ユーザーとパスワードの入力を自動化し、スクリプトにやらせようという企画。
今回は下記のようなWindowがあったとします。
(Webアプリでもデスクトップアプリでも構いません)
上記のフォームに対して「USER ID」と「PASSWORD」を入力し、ログインボタンをクリックする。というスクリプトを作成します。
(セキュリティ的にどうなの?という話は置いておいて)
早速サンプルコード。
#SendKeysを使うため、System.Windows.Forms名前空間読込
Add-Type -AssemblyName System.Windows.Forms
Start-Sleep -m 500
#[Alt] + [TAB]で前回表示Windowに切替
[System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
Start-Sleep -m 500
#USERID入力
[System.Windows.Forms.SendKeys]::SendWait("administrator")
#PASSWORD入力
[System.Windows.Forms.SendKeys]::SendWait("{TAB}")
[System.Windows.Forms.SendKeys]::SendWait("password")
#ログイン実行
#Enterでログインできる場合
#[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
#Enterでログインできない場合はTABで移動して実行
[System.Windows.Forms.SendKeys]::SendWait("{TAB}")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Windows PowerShell ISE上で実行する場合は、先頭の「Add-Type -AssemblyName System.Windows.Forms」は不要ですが、PowerShell単体で実行する場合は必要になります。
Add-Typeを書かないで実行すると。。。
発生場所 C:\Users\XXXXX\Desktop\test-login.ps1:7 文字:1 + [System.Windows.Forms.SendKeys]::SendWait("%{TAB}") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Windows.Forms.SendKeys:TypeName) []、RuntimeException + FullyQualifiedErrorId : TypeNotFound
上記のエラーとなります。名前空間が読み込めていないようですね。
基本的にアクティブなウィンドウに対してキー入力を行いますが、注意点があります。UAC有効時、「管理者として実行」などを行い、異なる権限で実行しているアプリケーションに対してはキー送信できません。
参考までに、他の特殊キーに対応するコードを載せておきます。
キー | コード |
---|---|
Shift | + |
Ctrl | ^ |
Alt | % |
Windows | ^{ESC} ※Ctrl + Esc |
PowerShellはデフォルトの関連付けがメモ帳となっているため、ファイルをダブルクリックしてもメモ帳が起動するだけです。右クリックから「PowerShellで実行」を選べば実行できますが、これでは不便です。
解決策として、
①PowerShellスクリプト(.ps1)のショートカットを作成
③リンク先 の先頭に「powershell 」を追加してOK。
④上で作成したショートカットがPowerShellとして認識されます。
これでショートカットの方をダブルクリックや「スタートアップに突っ込む」で実行できます。
上記サンプルコードとショートカットの作成で、ダブルクリックで実行できるようになりました。
無事に「USER ID」「PASSWORD」が入力され、ログインボタンが押せました。
これを応用すれば、ルーティンワークの自動化はもちろん。アプリのロングラン試験などにも使えます。
おしまい。