PowerShellで業務自動化計画

うちの職場ではネット上のツールをインストールするのにも別の部署の許可が必要らしいのでPowerShellをつかって自分でツールを作るしかないです。なのでその時に便利なものをまとめます。

 

まあGUIでの自動化って環境によって上手く行かない事が多いので出来ればCUIでどうにかしたほうが良いのですが、エクセルやワードの操作はバッチファイルでやるのは厳しいところ。

 

小出しにしていたのをまとめてみます。

よく使うコマンド

ソフトの立ち上げ

Start-Processコマンドを使います。URLを入力すると標準設定のブラウザで開いてくれたりして便利です。ランチャーのような使い方のできると思います。

キー操作

[System.Windows.Forms.SendKeys]::SendWait("")のコマンドを使います。("")の中に文字列をいれていきましょう。全角の日本語でもしっかり入力してくれます。楽しいね。{TAB}と書けばTABキーを押してくれます。

特殊な文字は

" " スペースキーを入力したい場合は半角スペースでOK!具体的にはSendWait(" ")のように入力しましょう
"^" Controlキーを入力したい時は^を使います。"^f"で文字列検索、"^s"で上書き保存などショートカットキーも使えます
"%" Altキーを入力したい時は%を使います。"%{F4}"を使ってアプリの終了は割りとよく使うと思います。
"+"

Shiftキーを入力したいときは+を使います。"+{TAB}"を使って前の項目を選択したりしましょう。

その他のキーのことは下記を参照してください

SendKeys クラス (System.Windows.Forms) | Microsoft Learn

処理待ち

Start-Sleepコマンドを使います。

Start-Sleep -m 500で500ミリ秒(0.5秒)待ちます。

Start-Sleep -s 1で1秒待ちます。

キー操作やソフトの立ち上がりを待つのに使ったりします。

 

ただソフトを起動するのにかかる時間というのはPCの性能やら他の作業状況やらで変動するもの。1秒で終わる事もあれば8秒かかる事もあり、「じゃあバッファをとって10秒待たせよう」とすると1秒で起動完了したときに無駄に待つことになったりします。それは避けたい。

 

そう言うときはGet-Processを使うといい感じになります。これを使うとタスクマネージャーで見るようなプロセスを取得できますので、その中のウィンドウ名がファイル名と同じものがあるかを聞けばOKです。

 

CSV取り込み

例えば下記のようなCSVファイルがあったとします。

氏名,年齢,性別,職業
谷岡俊一,32,男性,会社員
山田太郎,24,男性,大学生
鈴木花子,41,女性,主婦
田中次郎,57,男性,自営業

その場合、Import-Csvのコマンドを使って取り込みます。今回は日本語を取り込むので文字コードUTF-8にしないと文字化けしてしまいます。ですので下記のように取り込んでください。

$csv = Import-Csv -Path "csvファイルのパス" -Encoding UTF8

取り込んだ後は$csv[1].年齢の中に24が入ってます。[]の中の数字がROW(列)でその後にcolumn名がくるわけですね。

Columnの中から特定のものを抽出したい場合はWhere-Objectのコマンドを使います。今回の名簿から男性をピックアップしたいのなら下記のように追記します。

$selectedRows = $csv | Where-Object { $_.性別 -eq "男性" }

 

サンプルコード

自分が自動化させる時によく使うコマンドを上げていきましたが、やはりまとまった流れの方が分かりやすいと思うのでグーグルでうんこと検索するコードを作ってみました。

Googleでうんこと検索する
#キー入力ができるようにする
Add-Type -AssemblyName System.Windows.Forms
#グーグルを開く
Start-Process https://www.google.com/
Start-Sleep -Seconds 1

#うんこで検索する
[System.Windows.Forms.SendKeys]::SendWait("うんこ")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}"
ファイルを開いてそのファイルが開き終わるのを待つ
# ファイルの絶対パスを指定
$file = "ファイルの絶対パス"

# ファイルを開く
Start-Process $file

# ファイルを開いたプロセスを確認する
$process = $null
$file = Split-Path $file -Leaf
while ($process -eq $null) {
    Start-Sleep -Seconds 1
    $process = Get-Process | Where-Object { $_.MainWindowTitle -like "*$file*" }
}

# プロセスが確認できたら、メッセージを表示する
Write-Host "ファイルを開いたプロセスが確認できました。"