Programming Field

PowerShell とコマンドプロンプトの組み合わせ実用例 - Windowsコマンド実用例

コマンドプロンプト(cmd)と PowerShell を組み合わせることで、従来のバッチ資産を活かしつつ、より柔軟で実用的な自動化が可能になります。本ページでは、両方向の呼び出し(cmd→PowerShell / PowerShell→cmd)を小さな実例で紹介します。

使用コマンド

  • Cmd - コマンドプロンプトの起動
  • Robocopy - 高機能なファイルコピー/同期
  • Forfiles - 日付やパターンによるファイル選択
  • Icacls - アクセス制御リスト(ACL)の変更

※ 本ページでは PowerShell も併用します (Windows 標準の Windows PowerShell 5.1 を想定)。

実用例 1: cmd から PowerShell を呼び出す

バッチ内から PowerShell の機能を必要なときだけ呼び出します。軽量な資産を活かしながら、文字列処理・整形などを補強できます。

現在日時を表示

powershell -Command "Get-Date"

PowerShell の出力をバッチ変数に取り込む

@echo off
set currentUser=
for /f "delims=" %%i in ('powershell -Command "$env:USERNAME"') do set currentUser=%%i
echo 現在のユーザー: %currentUser%

実用例 2: PowerShell から cmd のコマンドを呼び出す

既存の cmd コマンド・バッチを PowerShell のワークフローに組み込みます。大量ファイルのコピー・同期などは robocopy が便利です。

バックアップ同期

cmd /c "robocopy C:\Data C:\Backup /MIR /MT:8"

実用例 3: 古いログの抽出と整形

forfiles で 30 日以上前のログファイルを抽出し、PowerShell で CSV に整形します。

古いログの一覧を作成

forfiles /p "C:\Logs" /s /m *.log /d -30 /c "cmd /c echo @path" > C:\Logs\OldFiles.txt

一覧を CSV に整形

powershell -Command "Get-Content 'C:\Logs\OldFiles.txt' ^| ForEach-Object { [pscustomobject]@{ Path = $_ } } ^| Export-Csv -NoTypeInformation 'C:\Logs\OldFiles.csv'"

実用例 4: 権限変更 + 結果通知

権限変更は cmd の icacls、通知は PowerShell で実施します。

フォルダ権限を一括変更

icacls C:\Data /grant Users:(R)

変更結果をメール送信 (Windows PowerShell)

powershell -Command "$out = cmd /c 'icacls C:\Data /grant Users:(R)'; Send-MailMessage -To 'admin@example.com' -Subject '権限変更結果' -Body $out -SmtpServer 'smtp.example.com'"

注: Send-MailMessage は Windows PowerShell 5.1 では利用できますが、PowerShell 7 以降では非推奨/同等機能なしのため、必要に応じて外部サービスの Webhook (Invoke-RestMethod) 等の代替をご検討ください。

注意点

  • 引用符とエスケープ: cmd と PowerShell で引用ルールが異なります。上記のように^でエスケープするなど、長い 1 行コマンドでは特に注意してください。
  • 変数の受け渡し: 両者の変数スコープは独立しています。値の受け渡しは標準出力/入力、または一時ファイル経由が確実です。
  • 自動実行: 定期実行は Schtasks と組み合わせると便利です。

関連項目