検証環境

  • Windows 10 Pro 64bit (21H1)
  • Windows 10 Pro 64bit (21H2) 2023/12/22
  • Windows 11 Pro (23H2) 2024/6/11
  • Discord

Discord側の設定

私は以下のWebサイトを参考にしました

詳しくは「Webhook Discode」でググって!!
ウェブフックURLは、下記のPowerShellスクリプトファイル内で使うぞ!!

スクリプトファイル①:投稿文をスクリプト内で記入

スクリプト実行する前にダウンロード属性は消そうね

サンプルを試す場合「.ps1」ファイル内の「ウェブフックURL」を書き換えないと動かないぞ

# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

Discord_push_sample.ps1ファイルの解説

Powershellのスクリプトファイル
スクリプトファイル内の文字エンコードは「UTF-8(BOM付き)」
※必ずBOM付きの必要あり

本文に改行を入れたい時は「\n」を、「\」自体を入れたい場合は「\\」と入力しよう

# ユーザー名(username)
$usernemestr = "usernameテスト"
# 本文内容(content)
$contentstr = "テスト🐈1行目\nテスト🐈2行目\nテスト\\3行目"
# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

# json文字列を作成して、UTF-8に変換する
$bodyjson = "{`"username`": `"$usernemestr`", `"content`": `"$contentstr`"}"
$body = [System.Text.Encoding]::UTF8.GetBytes($bodyjson)

#Discordに送る
Invoke-WebRequest -Headers @{"Content-Type"="application/json"} -Method Post -Body $body $webhookurl

Discord_push_sample.batファイルの解説

Powershellのスクリプトファイルを実行するためのバッチファイル
バッチファイル内の文字エンコードは「Shift-JIS」

「Discord_push_sample.ps1」と「Discord_push_sample.bat」は同じフォルダに置いてね

なんで直で実行しないかと言うと、Powershell側であらかじめ実行権限の設定を色々しなきゃいけなくて、それは面倒なので一時的に実行権限を持って実行できる書き方をバッチファイルに書いてる

rem ---------------------------------------
rem 同じフォルダにあるDiscord_push_sample.ps1をpowershellコマンドとして実行
rem
rem [%~dp0]はカレントディレクトリを取得
rem スペース入りファイルパスを想定し["]で囲う
rem ---------------------------------------

set ps1filename="%~dp0Discord_push_sample.ps1"

powershell -ExecutionPolicy Unrestricted -File %ps1filename%

スクリプトファイル②:投稿文が別テキストファイル(UTF-8・改行CRLF)

スクリプト実行する前にダウンロード属性は消そうね

サンプルを試す場合「.ps1」ファイル内の「ウェブフックURL」を書き換えないと動かないぞ

# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

Discord_push_TextFileMessage_sample.ps1ファイルの解説

Powershellのスクリプトファイル
ファイル内の文字エンコードは「UTF-8(BOM付き)」
※必ずBOM付きの必要あり

# ユーザー名(username)
$usernemestr = "usernameだよ"

# 本文内容のテキストファイル名
# テキストファイルのエンコーディングはUTF-8(BOMは有・無どっちでも)、改行はCRLFで
# ファイル名はフルパス指定でも動くぞ
# 例えば $pushfilename = "d:\hoge\hoge\file.txt" とか
$pushfilename = "file.txt"

# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

#テキストファイルの内容を取り出す
$contentstr = Get-Content $pushfilename -Raw -Encoding utf8

# "\"を"\\"という文字列に変換する(\は特殊文字扱いなので\\としてエスケープ)
$contentstr = $contentstr -replace "\\","\\\\"

# 改行(CRLF)を"\n"という文字列に変換する
$contentstr = $contentstr -replace "`r`n","\n"

# json文字列を作成して、UTF-8に変換する
$bodyjson = "{`"username`": `"$usernemestr`", `"content`": `"$contentstr`"}"
$body = [System.Text.Encoding]::UTF8.GetBytes($bodyjson)

#Discordに送る
Invoke-WebRequest -Headers @{"Content-Type"="application/json"} -Method Post -Body $body $webhookurl

Discord_push_TextFileMessage_sample.batファイルの解説

Powershellのスクリプトファイルを実行するためのバッチファイル
バッチファイル内の文字エンコードは「Shift-JIS」

「Discord_push_TextFileMessage_sample.ps1」と「Discord_push_TextFileMessage_sample.bat」は同じフォルダに置いてね

なんで直で実行しないかと言うと、Powershell側であらかじめ実行権限の設定を色々しなきゃいけなくて、それは面倒なので一時的に実行権限を持って実行できる書き方をバッチファイルに書いてる

rem ---------------------------------------
rem 同じフォルダにあるDiscord_push_TextFileMessage_sample.ps1をpowershellコマンドとして実行
rem
rem [%~dp0]はカレントディレクトリを取得
rem [.ps1]の後ろに[;]を付ける必要がある
rem スペース入りファイルパスを想定し["]で囲う
rem ---------------------------------------

set ps1filename="%~dp0Discord_push_TextFileMessage_sample.ps1"

powershell -ExecutionPolicy Unrestricted -File %ps1filename%

file.txtファイル(投稿文が入ったテキストファイル)の解説)

テキストファイルのエンコーディングはUTF-8(BOMは有り・無しどっちでも)、改行はCRLFで
当然絵文字も使える

サンプル

ああああ🐈
いいいい🐈
うううう🐈

ええええ🐶
おおおお🐶
かかかか🐶

きききき❤
くくくく❤
けけけけ❤

スクリプトファイル③:(おまけ)グローバルIPアドレス付きの投稿文

スクリプト実行する前にダウンロード属性は消そうね

サンプルを試す場合「.ps1」ファイル内の「ウェブフックURL」を書き換えないと動かないぞ

# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

こんな感じで表示されます

Discord_push_global_ip_sample.ps1ファイルの解説

Powershellのスクリプトファイル
ファイル内の文字エンコードは「UTF-8(BOM付き)」
※必ずBOM付きの必要あり

本文に改行を入れたい時は「\n」と入力しよう

Discord投稿文でコードブロックを表示したい場合「```コード```」という感じで記入するが
Powershellでは「`」をエスケープ文字列として認識するため、
スクリプトの中では「``````コード``````」という感じで入力する事になる

# ユーザー名(username)
$usernemestr = "usernameテスト"

# グローバルIPを取得
# https://ipinfo.io/ip のWebサービスを使用
$globalip =  (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content

# 本文内容(content)
$contentstr = "グローバルIPアドレス表示テスト\n``````" + $globalip + "``````"
# ウェブフックURL(Webhook URL)
$webhookurl = "https://discord.com/api/webhooks/**************************"

# json文字列を作成して、UTF-8に変換する
$bodyjson = "{`"username`": `"$usernemestr`", `"content`": `"$contentstr`"}"
$body = [System.Text.Encoding]::UTF8.GetBytes($bodyjson)

#Discordに送る
Invoke-WebRequest -Headers @{"Content-Type"="application/json"} -Method Post -Body $body $webhookurl

Discord_push_global_ip_sample.batファイルの解説

Powershellのスクリプトファイルを実行するためのバッチファイル
バッチファイル内の文字エンコードは「Shift-JIS」

「Discord_push_global_ip_sample.ps1」と「Discord_push_global_ip_sample.bat」は同じフォルダに置いてね

なんで直で実行しないかと言うと、Powershell側であらかじめ実行権限の設定を色々しなきゃいけなくて、それは面倒なので一時的に実行権限を持って実行できる書き方をバッチファイルに書いてる

rem ---------------------------------------
rem 同じフォルダにあるDiscord_push.ps1をpowershellコマンドとして実行
rem
rem [%~dp0]はカレントディレクトリを取得
rem スペース入りファイルパスを想定し["]で囲う
rem ---------------------------------------

set ps1filename="%~dp0Discord_push_global_ip_sample.ps1"

powershell -ExecutionPolicy Unrestricted -File %ps1filename%

参考Web