はじめに
Microsoft Teamsに通知を送る処理をバッチなどに組み込みやすいよう、batファイル化しました。バッチの使用方法、WebHookURLの取得方法とソースコード内容の説明をします。
1.使い方
呼出元のbatファイルと同じディレクトリに設置して、下記のように呼び出して使用します。
@echo off
set WEBHOOK_URL="https://XXXX3.34.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/XXXXX/triggers/manual/paths/invoke?api-version=1&sp=/triggers/manual/run&sv=1.0&sig=XXXXXXXXXXXXXX"
:: ~各種バッチ処理~
if %ERRORLEVEL% equ 0 (
call teams.bat %WEBHOOK_URL% "処理が完了しました"
) else (
call teams.bat %WEBHOOK_URL% "処理が失敗しました"
)
WebHookURLはURLデコードして%記号が無い状態にしたものを使用してください。
例えば、以下のように変換する必要があります
- 修正前:
https://example.com%2Fpath%2Fto%2Fwebhook - 修正後:
https://example.com/path/to/webhook
2.バッチファイルのソースコード
下記のソースコードをteams.batの名前で保存してください。文字コードはSHIFT-JISです。
@echo off
setlocal enabledelayedexpansion
::===============================
::【Teams送信用バッチ】
::-------------------------------
:: teams.bat "https://WebHookのURL" "送信するメッセージ"
::
:: 1. 送信先のチャネルに対してワークフロー設定を行い、Webhook用URLを取得
:: 2. そのURLをURLデコード(パーセント記号を無くす)したものを用意
:: 3. 第一引数にURL、第二引数にメッセージを指定して実行
::
:: ※URLは必ずダブルクォーテーションで括ること
:: ※メッセージも記号等含む場合は括った方が無難
::===============================
if "%~1"=="" (
echo.
echo teams.bat "https://WebHookのURL" "送信するメッセージ"
exit /b 1
)
set CUR_DIR=%~dp0
cd /d "%CUR_DIR%"
::このバッチを連射するとYMDHMSの秒が被る可能性があるので、重複しないよう工夫
set TIME_TMP=%TIME: =0%
set YMDHMS=%DATE:/=%%TIME_TMP:~0,2%%TIME_TMP:~3,2%%TIME_TMP:~6,2%
::GUIDを使用しているので重複は起きないものとする
for /f "delims=" %%A in ('powershell -Command "[guid]::NewGuid()"') do set GUID=%%A
set WORKDIR=%TMP%\Teams_%YMDHMS%_!GUID!
mkdir %WORKDIR%
::curlコマンドの存在確認
where curl > NUL 2>&1
if !ERRORLEVEL! neq 0 (
echo Error: curl is not installed. >> "%WORKDIR%\log.txt"
exit /b 1
)
::入力引数の取得
set INPUT_ARGS=%*
::引数からWebhookURLとメッセージを分割
for /F "tokens=1,* delims= " %%i in ("!INPUT_ARGS!") do (
set WEBHOOK_URL=%%i
set MESSAGE=%%j
)
::ダブルクォーテーションでくくった文字列の場合、中身だけ使用
set WEBHOOK_URL=!WEBHOOK_URL:~1,-1!
::メッセージの方は無しでも動くようにしておく
set TRIMMED_MESSAGE=!MESSAGE:~1,-1!
if "!TRIMMED_MESSAGE!"==!MESSAGE! (
set MESSAGE=!TRIMMED_MESSAGE!
)
::JSON的にエスケープが必要な文字(バックスラッシュ、ダブルクォーテーション、スラッシュ、タブ)
set ESC_MESSAGE=!MESSAGE!
set ESC_MESSAGE=!ESC_MESSAGE:\r\n=\n!
set ESC_MESSAGE=!ESC_MESSAGE:\r=\n!
set ESC_MESSAGE=!ESC_MESSAGE:\n=#CrLf#!
set ESC_MESSAGE=!ESC_MESSAGE:\=\\!
set ESC_MESSAGE=!ESC_MESSAGE:"=\"!
set ESC_MESSAGE=!ESC_MESSAGE:/=\/!
set ESC_MESSAGE=!ESC_MESSAGE: =\t!
::引数で^を渡すと、^^と二重になってしまう
set ESC_MESSAGE=!ESC_MESSAGE:^^^^=^^!
::Teamsのアダプティブカードで改行するには\n\nと二回重ねる必要がある
set ESC_MESSAGE=!ESC_MESSAGE:#CrLf#=\n\n!
::UTF-8(BOM)でのJSON作成と送信
chcp 65001 > NUL
set JSON_FILE="%WORKDIR%\payload.json"
(
ECHO {
ECHO "attachments": [
ECHO {
ECHO "contentType": "application/vnd.microsoft.card.adaptive",
ECHO "content": {
ECHO "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
ECHO "type": "AdaptiveCard",
ECHO "version": "1.4",
ECHO "body": [
ECHO {
ECHO "type": "TextBlock",
ECHO "text": "!ESC_MESSAGE!",
ECHO "wrap": true,
ECHO "markdown": false
ECHO }
ECHO ]
ECHO }
ECHO }
ECHO ]
ECHO }
) > %JSON_FILE%
chcp 932 > NUL
curl -X POST -H "Content-Type: application/json" -s -d @%JSON_FILE% "!WEBHOOK_URL!" > "%WORKDIR%\curl.txt" 2>&1
findstr /i "error" "%WORKDIR%\curl.txt" > NUL 2>&1
::エラーがあったら
if !ERRORLEVEL! equ 0 (
echo Error: Failed to send notification to Teams. >> "%WORKDIR%\log.txt"
exit /b 1
)
::正常系の場合、ログは不要なので削除
rd /s /q "%WORKDIR%"
exit /b 0
3.WebHookURLの取得方法
1.ワークフロー設定を開く
Teamsのチャネル横にある「・・・」メニューからワークフローを選択

2.WebHook通知用を選択
「Webhook要求を受信するとチャネルに投稿する」をクリック

3.名前の設定と接続確認
「名前」に任意の名称を入力。
この画像ではメールアドレス横に✔️が表示されていますが、⚠️の場合はその隣のメニューから再接続作業が必要です。問題なければ「次へ」

4.名前の設定と接続確認
5.名前の設定と接続確認
これでURLは取得できましたが、バッチの引数として渡すと%2Fが%2つまり「第二引数」と勘違いして展開されてしまう問題があります。
これについてはURLデコードすることで問題なく送信できます。
URLデコードの方法は色々ありますが、今回のワークフローで払い出されるURL形式に関しては変更される箇所がスラッシュ記号の%2Fしかないため%2Fを/に一括置換する方法が楽です。
4.細かい補足
通知処理呼び出しを非同期にする
通知処理を呼び出すたびに、通知の送信完了を待つとバッチ処理がその分遅くなります。callではなくstartを使用すると非同期処理となり待ち時間が無くなります。
start /min "" cmd /c teams.bat %WEBHOOK_URL% "メッセージ"
送信メッセージの内容について
一応、ダブルクォーテーションで括ってないメッセージもサポートしてます(スペースが途中入っても可)
teams.bat %WEBHOOK_URL% エラーです。C:\Program Filesに必要なプログラムが入ってませんでした
「&」「|」「<」「>」といった記号が含まれる場合はダブルクォーテーションで囲まないと正常に実行できません。
::NG
teams.bat %WEBHOOK_URL% & | < >
::OK
teams.bat %WEBHOOK_URL% "& | < >"
ダブルクォーテーション内のダブルクォーテーションはエスケープ不要です。
teams.bat %WEBHOOK_URL% "エラーです。"int a;"という行が失敗しました"
:: 通知される文章は「エラーです。"int a;"という行が失敗しました」となります
大丈夫かどうかの基準としてはechoしてエラーが出ない文章かどうかになります。
フッターの余計な文字を消す方法
通知を送信すると自動で下記の文言が付いてきます。
XXXX used a Workflow template to send this card. Get template
これを消すための方法が下記リンクにありましたので紹介します。
Microsoft Teams – How to remove “ used a Workflow template to send this card. Get template”
修正前
修正後
1.Workflowの一覧ページへアクセス
https://make.powerautomate.com/
2.マイフローから作成したフローを探す
「マイフロー」をクリック
作成したものと同じ名前のフローを探してクリック
3.名前を付けて複製
4.新しいWebhook URLを控える
「編集」ボタンから編集画面へ
「Teams Webhook 要求を受信したとき」をクリックすると左横からURLの画面が表示されます
新しいWebhook URLをコピーして控えておきます(バッチのURLはこれに書き換える必要があります)
5.フローを有効化
「オンにする」をクリックして有効化します
以上です











