バッチファイル(.bat)は手軽に使える自動化スクリプトとして広く利用されていますが、構文の制約により複雑な処理には不向きです。一方、PowerShellは.NETベースの強力なスクリプト言語で、ファイル操作やJSON処理、API連携などに長けています。
本記事では、バッチファイルからPowerShellスクリプトを呼び出し、高度な処理を連携して実行する方法を解説します。
バッチとPowerShellの使い分けが有効な理由
バッチファイルは以下のような処理に適しています。
- ファイルコピーや起動処理など単純な制御
- タスクスケジューラとの組み合わせ
- レガシーシステムとの互換性確保
一方、PowerShellは次のような用途に力を発揮します。
- 複雑な文字列処理や日付操作
- JSONやXMLなど構造化データの操作
- SMTP送信やREST API連携
基本構文:バッチからPowerShellを呼び出す
PowerShellの実行は、バッチファイル内で以下のように記述します。
powershell -NoProfile -ExecutionPolicy Bypass -File "script.ps1"
-NoProfile
はプロファイルを読み込まずに実行、-ExecutionPolicy Bypass
は一時的に制限を解除するオプションです。
サンプル構成:バッチからメール送信PowerShellを呼び出す
例として、バッチファイルからメール通知を行うPowerShellスクリプトを呼び出すケースを紹介します。
メール送信用 PowerShell スクリプト(sendmail.ps1)
$smtpServer = "smtp.example.com"
$from = "alert@example.com"
$to = "admin@example.com"
$subject = "バッチ処理完了通知"
$body = "バッチ処理が完了しました。"
Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject $subject -Body $body
バッチファイル(run.bat)
@echo off
echo バッチ処理を実行中...
rem 任意のバッチ処理(例:バックアップ)
xcopy C:\data\*.txt D:\backup\ /D /Y
rem PowerShellによる通知処理の呼び出し
powershell -NoProfile -ExecutionPolicy Bypass -File "sendmail.ps1"
echo 処理が完了しました。
pause
PowerShellコードをバッチ内に直接埋め込む方法
短いPowerShellコードであれば、-Command
オプションを使ってバッチ内に直接記述することも可能です。
powershell -Command "Get-Date >> log.txt"
ただし、複雑な構文や改行を含む場合は外部ファイルに分離したほうが安全です。
応用例:バッチ→PowerShell→API連携
PowerShellを使えば、REST APIを利用した通知やデータ取得も可能です。たとえば以下のようにSlack Webhookを使った通知も簡単に実装できます。
$payload = @{text = "処理が完了しました"} | ConvertTo-Json
Invoke-RestMethod -Uri "https://hooks.slack.com/services/xxxxx/xxxxx/xxxxx" -Method Post -Body $payload -ContentType 'application/json'
このスクリプトをバッチから呼び出すことで、Slack通知付きバッチ処理が完成します。
まとめ
バッチファイル単体では限界のある処理も、PowerShellと組み合わせることで高度な自動化が可能になります。
特に以下のような用途では、両者の連携が非常に有効です。
- 実行ログを整形して保存
- CSVファイルを読み込んで集計
- 外部サービスへの通知・連携
既存のバッチ資産を活かしながら、PowerShellの力を借りてより柔軟で賢い自動化スクリプトを構築してみてください。