2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Teams通知用のコマンドプロンプトバッチファイル【ワークフロー対応版】

Last updated at Posted at 2025-10-14

はじめに

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のチャネル横にある「・・・」メニューからワークフローを選択
1_ワークフロー設定呼び出し.png

2.WebHook通知用を選択

「Webhook要求を受信するとチャネルに投稿する」をクリック
2_Webhookフローを選択.png

3.名前の設定と接続確認

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

4.名前の設定と接続確認

「ワークフローを追加する」をクリック
4_送信先の確認と決定.png

5.名前の設定と接続確認

「完了」を押す前に必ずURLをコピーして控えましょう。
5_URLをコピーして終了.png

これで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”

修正前

フッターあり.png

修正後

フッターなし.png

1.Workflowの一覧ページへアクセス

https://make.powerautomate.com/

2.マイフローから作成したフローを探す

「マイフロー」をクリック

x1_Powerautomate.png

作成したものと同じ名前のフローを探してクリック

x2_flowlist.png

3.名前を付けて複製

x3_copy.png

x4_name.png

4.新しいWebhook URLを控える

「編集」ボタンから編集画面へ

x5_mod.png

「Teams Webhook 要求を受信したとき」をクリックすると左横からURLの画面が表示されます

x6_shikaku.png

新しいWebhook URLをコピーして控えておきます(バッチのURLはこれに書き換える必要があります)

x7_url.png

5.フローを有効化

「オンにする」をクリックして有効化します

x8_active.png

以上です

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?