見出し画像

キーボード入力の自動化メモ(PowerShell)

注記

本記事は筆者の環境で確認した内容に基づいて作成していますが、本記事を参考に何かを行う場合は自己責任でお願いします。

前置き

クリップスタジオでJPEG形式ファイルが開けなかったので、Windows標準搭載のペイントで一度JPEG形式ファイルを開いてPNG形式として保存しなおすことに。しかし同じ作業をそこそこの数のファイルに対して行いたいため、何とか自動化できないか検討。結果、Windows標準搭載のWindows PowerShellによりキーボード入力を自動化できることが判明、一連の操作を機械任せにすることができた。応用すれば色々自動化できそうなので今回やったことをメモしておく。

Windows PowerShellとは

コマンドプロンプトの強化版みたいなもので、コマンドプロンプト以上に色々できるらしい。今回はPowerShellのスクリプトを組む。基本的には、実行するコマンドを羅列したテキストファイルを「○○.ps1」として保存すればOK。スクリプトを実行する際は、ターミナルにスクリプトのファイルパスをそのまま入力すれば実行できる。

無題

試しに作ってみたスクリプト(paint_save_only.ps1)

テスト用に簡単なスクリプトを作成。ペイントを開いてそのまま白紙の画像を"test.png"として保存する。#で始まる行はコメント。
注1) 「名前をつけて保存」ウィンドウが出た際に表示されているフォルダにそのまま保存する。
注2) 実行中に別のキーを入力したり、PCの処理速度のせいで処理待ち時間が足りなかったりした場合、キー入力の結果が予期せぬ動作となる場合がある。
注3) 上書き保存の場合は想定していない。

# おまじない
add-type -AssemblyName System.Windows.Forms

# ペイント起動
mspaint

# ペイント起動待ち
Start-Sleep -m 1000

#「Ctr+S」=「保存」※「名前をつけて保存」ウィンドウが出る
[System.Windows.Forms.SendKeys]::SendWait("^s")

# 「名前をつけて保存」ウィンドウが出るまで若干待ち
Start-Sleep -m 500

# ファイル名を入力
[System.Windows.Forms.SendKeys]::SendWait("test.png")

# 保存
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

# 保存が終わるまで待ち
Start-Sleep -m 1000

# ウィンドウを閉じる
[System.Windows.Forms.SendKeys]::SendWait("%{F4}")

解説

#おまじない
add-type -AssemblyName System.Windows.Forms

キーボード入力の関数「[System.Windows.Forms.SendKeys]::SendWait()」を使う場合、先頭に書いておく必要がある。とりあえず書いておけばいい。


# ペイント起動待ち
Start-Sleep -m 1000

処理を待つ処理。ミリ秒で指定。「-m」を「-s」とすれば秒単位の指定になる。ウィンドウが出切る前にキーボード入力の処理をしてしまうと想定外の動作になるため、十分な待ち時間を設定する必要がある。


#「Ctr+S」=「保存」※「名前をつけて保存」ウィンドウが出る
[System.Windows.Forms.SendKeys]::SendWait("^s")

キーボード入力の処理。""の中身がキーボード入力される。文字の1つ前に「^」を付けるとCtlと同時押しの扱いになる。Shiftの場合は「+」、Altの場合は「%」。また、Enterキーなどの特殊なキーは「{ENTER}」のように、「{}」で囲んだ専用の指定方法が必要になる。詳細は下記のページ。

SendKeyメソッド

最終的にできたスクリプト(Conv_jpeg_png.ps1)

入力フォルダ内の全ファイルを1つずつペイントで開き、pngとして出力フォルダに保存。入力、出力フォルダは実行ごとにユーザが入力する形にした。

add-type -AssemblyName System.Windows.Forms

# 処理対象のフォルダ
$inFolder = (Read-Host 入力フォルダ)
$outFolder = (Read-Host 出力フォルダ)

# $inFolder内のファイル・フォルダのリストを取得する。
$itemList = Get-ChildItem $inFolder;
foreach($item in $itemList)
{
   if($item.PSIsContainer)
   {
       # フォルダの場合の処理
   }
   else
   {
       mspaint "$inFolder\$item"
       Start-Sleep -s 1

       #「Alt+F」=「ファイル」
       [System.Windows.Forms.SendKeys]::SendWait("%f")
       Start-Sleep -m 200
       #「A」=「名前を付けて保存」
       [System.Windows.Forms.SendKeys]::SendWait("a")
       Start-Sleep -m 200

       # ファイル名入力
       [System.Windows.Forms.SendKeys]::SendWait($item.Name.Substring(0, $item.Name.LastIndexOf(".") + 1) + "png")
       # フォルダ入力欄まで「TAB」で移動
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
       [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
       Start-Sleep -m 100
       [System.Windows.Forms.SendKeys]::SendWait($outFolder)
       Start-Sleep -m 100
       
       # 入力内容確定
       [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
       Start-Sleep -m 100
       # 保存
       [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
       Start-Sleep -m 1000
       #「透明度情報が失われ・・・」」と表示される→続行
       [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
       Start-Sleep -m 1000
       # ウィンドウを閉じる
       [System.Windows.Forms.SendKeys]::SendWait("%{F4}")
   }
} 


この記事が気に入ったらサポートをしてみませんか?