自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

PowerShellの実行結果をMicrosoft Teamsでbotに自動投稿させるのは割と簡単

実行完了まで時間の掛かるPowerShellスクリプト例えば大量のファイルをコピーするものや何度も再起動しながら実行するようなPCのキッティングスクリプトなどでエラー発生および完了の通知をチャットで受け取りたいという場合。

Slackの着信Webhookインテグレーションなどに対して Invoke-RestMethod コマンドレットでチャットに投稿させるが、実はMicrosoft TeamsでもIncoming Webhookというコネクタがあり、同じことが簡単に出来るというお話。

設定手順

  1. Webhook用のチャネルを作成
  2. チャネルにコネクタ「Incoming Webhook」を追加
  3. botの名前とアイコンを設定してURLをコピー
  4. PowerShellからInvoke-RestMethod してみる
続きを読む

For文での線形探索より高速 VBAで連想配列 Dictionaryオブジェクト

以下のような検索キー列がユニークであるテーブルからデータを取得したい(VLOOKUPみたいなイメージ)場合、処理回数が多いと WorksheetFanction.Vlookup やFor文での線形探索では時間がかかり過ぎる。

そんなときに役立つのが連想配列(Dictionaryオブジェクト)。

配列のようにインデックス番号からデータを取り出すのではなくキーの完全一致で要素を取り出せるので、処理が理解しやすいかつ高速であることが最大の利点。

f:id:maru0014:20200912124247p:plain

 

続きを読む

タスクスケジューラのxmlをコマンドで直接編集してバッテリーモードでも実行させる

バッチファイルで自分自身をタスクスケジューラに登録して再起動後も実行させようと思っても「コンピューターを AC電源で使用している場合のみタスクを開始する(P)」という項目がONの場合はノートPCが電源に接続されていない状態だとタスクを実行してくれない。

しかし、タスクスケジューラを操作できる schtasks コマンドで変更可能な項目は限られており、この項目もコマンドでは変更不可能なためどうしたものかと調べていたらxmlを直接操作することで変更できたのでご紹介。


バッテリー駆動でもタスクを実行させる関数

function disableOnlyRunAc-Task($taskName){
    $taskXml = [xml](schtasks /query /tn $taskName /xml)
    $taskXml.Task.Settings.DisallowStartIfOnBatteries = "false"
    $taskXml.Save("C:\tempTask.xml")
    schtasks /delete /tn $taskName /f
    schtasks /create /tn $taskName /xml "C:\tempTask.xml"
    Remove-Item "C:\tempTask.xml"
}

# コンピューターをAC電源で使用している場合のみタスクを開始するを無効化
disableOnlyRunAc-Task "<タスク名>"

※管理者権限での実行が必要

※xmlの操作を楽にするためにPowerShellを使用

続きを読む

自宅で開発・導入しているIoT機器や機能を晒してみる

多分生まれつきとにかく楽をしたい気持ちが強いが、GoogleアシスタントとAlexaなどの音声アシスタント、超小型の低消費電力コンピュータのRaspberry Pi、便利なIoTデバイスの登場がそれに拍車をかけた。

もしかしたら誰かの参考になるかもしれないので晒してみる。

  • 自動でSlackへ通知→GoogleHomeで読み上げ
    • お父さんが会社から出たらSlackへ通知→GoogleHomeで読み上げ
    • お父さんが自宅の半径100m以内に入ったらSlackへ通知→GoogleHomeで読み上げ
    • Slackへ定時投稿→GoogleHomeで読み上げ
  • スマートロック
  • Googleアシスタントコマンド
  • ペアレンタルコントロール
  • Raspberry Pi で作っている省電力サーバたち
  • スマート家電コントローラー(アプリ、Googleアシスタント、Alexaから操作可能)
  • GAS、スプレッドシート
  • 今後作りたいもの
続きを読む

New-DistributionGroup のMembers引数に配列を渡したいときはハッシュテーブルスプラッティング

Invoke-CommandInvoke-Expression なども考えられるが、今回の例に最も適しているであろう「スプラッティング」という方法を用いる。

実装例

以下のようなCSVをもとに配布リストの作成とメンバーの登録を同時に実行したいとする。

"address","members"
"sample1@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"
"sample2@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"

membersが一つの文字列として認識されてしまうパターン

これでいけると思いきや alice@codelife.cafe,bob@codelife.cafe というアドレスは存在しないとエラーが発生する。

$groups = Import-Csv "sample.csv"
foreach($group in $groups)
{
    New-DistributionGroup $group.Address $group.member
}
続きを読む