WindowsPowerShellをつかって連続作業をする機会があったので紹介させていただきます
目次
WindowsPowerShellをつかって連続作業をする機会があったので紹介させていただこうと思います。
よくある例として、Excel開いて全部の行を他のアプリに入力したいことや、Excelの表に書いてある一覧をブラウザーで提供されているツールに入力したいことってありますよね? 私はそういう機会がありました。
「単純にShellやVBAやC#やExcelMacroはたまた.batでできる!」って皆さんもいらっしゃいますが、「ワタクシはできません」。というか、試す機会があったし興味がわいたので、やってみました。
コピペコピペの単純作業を代理の小人さんにお願いする方法です。
本稿はある程度スキルかたの参考メモにしていただけますとうれしく思います。
但し、しっかりとした処理を書きたい方向けのやり方ではありませんので、しっかり自動処理を作りたい方はこのページは参考にもなりませんので、読み飛ばしてくださいね。
ご注意:
本記事を参考にして何か起こしてしまった際の責任はご自身でとる必要があります。常に言えることですが、自己責任で実施してください。特に今回ご紹介するやり方にはエラー処理を意識しないで書いています。たとえば自動実行させている間に何かの通知ダイアログが表示された場合(誤動作して勝手に予期しない処理に進んでしまう可能性があります)や、間違って触ってしまった場合の処理など対策は一切書いていません。よく、プロのエンジニアの方が「こういう有害なものをWeb上に書いて公開する奴のせいで、いい加減なコードを書く人間が増えるのだ!」ってお怒りになっているのを見かけますが、そういった方面の方は(是非日々培った都合の悪いものに出会ったときにやる)目をそらすスキルを発揮していただいて、本記事と目を合わせないで下さいませ。(ママ:「しっ!目を合わせちゃダメ!見ちゃだめよ」って扱いにしてください。意味不明)
何やら小人さんが動いてくれているようで楽しい。
自動演奏ピアノの鍵盤を見て楽しむのと同じ感じ(違うって?)だと思います。
WindowsPowerShellで自動キー入力を利用してExcelからWebブラウザのツールで入力というものを作ってみます。
(現在Excelから取得したデータを表示するところまでで停止しています。Chromeを起動して新規タブを開いてセルまでTABして変数を入力するのはもう少しだけ待ってください)
0、本件の環境
Windows10Professional(Windows7からのアップグレード)、MicrosoftOffice2013のExcel、ブラウザはgoogleChromeが入っている環境です。
1、パワーシェル起動
Windowsマーク(スタートボタン)をクリックして出てくる入力欄に[PowerShell]と入力
いくつか候補が出てきますが「windows PowerShell」をクリックします。
2、PowerShellを動作させるための実行環境になります。
お年を召している方や、開発をやっている方はわかるともいますがMS-DOSプロンプトのような画面ですね。
3、背景が紺色のコマンド入力画面
今回の場合
1 | お名前ニックネーム | 性別 | 最終更新日 | 種類 | 部門 | 添付ファイル名 |
2 | A子ちゃん | 女性 | 2016/01/01 | エンジニア | IT部門 | c:\A.txt |
3 | B男君 | 男性 | 2016/04/11 | エンジニア | 開発部門 | c:\b.txt |
4 | C太郎君 | 男性 | 2015/05/21 | 営業 | IT部門 | c:\c.txt |
5 | D造さん | 男性 | 2014/06/6 | 電話番 | 総務 | c:\d.txt |
6 | E美さん | 非公開 | 2013/07/1 | 事務 | 総務 | c:\e.txt |
という表を
というブラウザでアクセスしたサイトに登録するということで書いてみます。
事前にc:¥に「a.txt」、「b.txt」、「c.txt」、「d.txt」、「e.txt」、を用意しておきます。(この例では実験用ですので中身が空のテキストファイルを用意して実施しました)
4、PowerShellでExcelがおいてあるフォルダ(ディレクトリ)に移動します。
cd C:\ |
\ となっている箇所は 半角の¥記号であると読み替えてくださいね
5、PowerShellのコマンド開始
キー操作をPowerShellから行うためと、その他小細工をするためのおまじないをします。
[System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) add-type -AssemblyName microsoft.VisualBasic add-type -AssemblyName System.Windows.Forms |
動作で異常が起きたりすることがあるので(まだ前の操作が終わっていないのに次の動作をしてしまったりするので、タイミングあわせで)待ち時間を設定します。
start-sleep -m 500 |
これは -m 500 で 0.5秒 待ちますという意味です。10秒待つですと -s 10 となります。
6、Excelを開きます。
$excel = New-Object -ComObject Excel.Application $excel.Visible = $true $excel_book = $excel.Workbooks.Open(“c:\test.xlsx”) |
\ となっている箇所は 半角の¥記号であると読み替えてくださいね
c:¥にある test.xlsx を開いてくださいという意味です。
ここまで打ってEnterキーを押すとExcelが起動すると思います。
開いたExcelファイルの最初のシートを開きます。
$excel_sheet = $excel.Worksheets.Item(1) |
test.xlsx の一番最初のワークシートを開いてくださいという意味です。
7、Excelファイルのセル連続取得実験
上例のA子ちゃんの行からE子ちゃんの行を連続取得して表示する実験を行います。
開いたExcelファイルの最初のシートを開きます。
#for の行は2行目~6行目まで繰返すという意味。$cntという変数に処理中の行番号が入ります。
for($cnt = 2;$cnt -lt 7; $cnt++){ # $oname という変数に $cnt行目で1項目眼のセルの内容を読み込みます ex.A子ちゃん、B男君、、、 #性別、最終更新日、種類、部門 echo $oname |
これをうつと 動作結果として↓
A子ちゃん 女性 2017/1/1 エンジニア IT部門 c:¥A.txt ======== B男君 男性 2016/4/11 エンジニア 開発部門 c:\a.txt ======== C太郎君 男性 2015/5/21 営業 IT部門 c:\a.txt ========D造さん 男性 2014/6/6 電話番 総務 c:\a.txt ======== E美さん 非公開 2013/7/1 事務 総務 c:\a.txt ======== |
という表示がされると思います。
8、Chromeを起動
Chromeを起動して、任意ページを表示します。
$ps = Start-Process chrome.exe -ArgumentList “http:/192.168.1.200/data/input.html” -PassThru |
http://のアドレスや、接続先サイトは参考です。この例ですと Chromeを起動して 192.168.1.200のサーバのdata/input,htmlを言うページを開いて下さい。という意味になります。
Chromeを起動して新規タブで指定されてページにアクセスします。
9.連続で登録
人間がキーを操作する感覚で、ブラウザーを操作します。Chromeを起動して新規タブを開いてセルまでTABして変数を入力します。
#for の行は2行目~6行目まで繰返すという意味。$cntという変数に処理中の行番号が入ります。 for($cnt = 2;$cnt -lt 7; $cnt++){#Excelから、お名前、性別、最終更新日、種類、部門 $oname = $excel_sheet.Cells.Item($cnt,1).Text; $sex = $excel_sheet.Cells.Item($cnt,2).Text; $upddate = $excel_sheet.Cells.Item($cnt,3).Text; $kind = $excel_sheet.Cells.Item($cnt,4).Text; $sect = $excel_sheet.Cells.Item($cnt,5).Text; $fname = $excel_sheet.Cells.Item($cnt,6).Text;#Chromeにで 出力 $ps = Start-Process chrome.exe -ArgumentList “http:/192.168.1.200/data/input.html” -PassThru#Chromeが立ち上がるまで5秒ぐらい待つ(時間いい加減です) Start-Sleep -s 5;#最初の入力フィールド (お名前) に移動 [System.Windows.Forms.SendKeys]::SendWait(“{TAB}”); Start-Sleep -m 100; [System.Windows.Forms.SendKeys]::SendWait($oname); Start-Sleep -m 100; |
#性別入力フィールドに移動
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
Start-Sleep -m 100;
[System.Windows.Forms.SendKeys]::SendWait($sex);
Start-Sleep -m 100;
#更新年月日入力フィールドに移動
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
Start-Sleep -m 100;
[System.Windows.Forms.SendKeys]::SendWait($upddate);
Start-Sleep -m 100;
#種別入力フィールドに移動
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
Start-Sleep -m 100;
[System.Windows.Forms.SendKeys]::SendWait($kind);
Start-Sleep -m 100;
#所属入力フィールドに移動
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
Start-Sleep -m 100;
[System.Windows.Forms.SendKeys]::SendWait($sect);
Start-Sleep -m 100;
#添付ファイル選択ダイアログを表示して、ファイル名入力(無理やりです)
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
#ファイル選択ダイアログが表示されるのを待つ
Start-Sleep -m 3000;
#ファイル名指定テキスト入力フィールドにフルパスのファイル名を入力
[System.Windows.Forms.SendKeys]::SendWait($fname);
Start-Sleep -m 3000;
#ファイル選択ダイアログを閉じる
[System.Windows.Forms.SendKeys]::SendWait(“{ENTER}”);
Start-Sleep -m 3000;
#登録ボタンに移動して”Enter”で登録実行
[System.Windows.Forms.SendKeys]::SendWait(“{TAB}”);
Start-Sleep -m 1000;
[System.Windows.Forms.SendKeys]::SendWait(“{ENTER}”);
Start-Sleep -m 3000;
#登録処理が終わる頃合いを見て処理を終了(Ctrl + w)で画面を閉じる
[System.Windows.Forms.SendKeys]::SendWait(“^w”);
Start-Sleep -m 700;
}
echo ‘最終行に達しました’
ご注意!この操作を行っている最中にキーボードやマウスを触ると手順がおかしくなることがあります。ご注意ください。
また、Chromeの設定、自動でページを開く設定になっていたり、何も表示されない状況で有ったり、自動で動かない場合があります。
こういった場合に備え、常に人間がPowerShellの画面に対して Ctrl + C (処理の緊急停止)を掛けられる体制でいてください。
10、開いていたものを閉じる
この下の処理は終わった時には実施するようにしてください。
#この下の $excel.Quit()を実施しないとExcelが開きっぱなしになってしまう $excel.Quit()#この下の処理をしないと使ったものを使いっぱなしにしてしまって、Windowsの再起動が必要になってしまう [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) | Out-Null |
本稿はある程度スキルかたの参考メモにしていただけますとうれしく思います。