PowerShell:Start-Processの基本と活用方法
目次
1. Start-Processの概要と使いどころ
Start-Processは外部アプリをPowerShellから柔軟に起動するための基本コマンドです。
- GUIアプリやコマンドを「新しいプロセス」として起動したいときに使います。
- 非同期で起動してすぐにPowerShellの制御を戻したい場合に便利です(既定では待機しません)。
-WorkingDirectoryで作業フォルダ(カレントディレクトリ)を指定できます。
- 新プロセスで起動する(例:メモ帳)
Start-Process notepad.exe
- 作業フォルダを指定して起動する(例:カレントを切り替えて起動)
Start-Process -FilePath "cmd.exe" -WorkingDirectory "C:\Work"
よくあるミスとして、「Start-Processは実行結果(標準出力)をそのまま返してくれる」と誤解しがちです。標準出力が必要な場合は、-Waitや出力リダイレクト等の設計が別途必要になります。
注意(権限・影響範囲): 管理者権限で実行すると、起動したプロセスがシステム設定やファイルに変更を加えるなど影響が大きくなる可能性があります。権限昇格が必要な操作は、対象・手順・影響範囲を事前に必ず確認してください。
2. 基本オプションとよく使う引数
結論(1行):-FilePath / -ArgumentList / -WorkingDirectory / -Verb / -NoNewWindow / -Wait の組み合わせが現場で頻出です。
手順/具体例:
- 基本起動(引数付き)
- 管理者で起動(UACあり)
- バックグラウンド実行(待機しない)
- 基本起動:Start-Process -FilePath "notepad.exe" -ArgumentList "C:\log.txt"
- 管理者で起動:Start-Process -FilePath "msiexec.exe" -ArgumentList "/i pkg.msi" -Verb RunAs
- バックグラウンド実行:Start-Process -FilePath "app.exe"
よくあるミス:引数をスペースで分けて渡すと意図と違う挙動になりがちです。-ArgumentList は「配列」または「1つの文字列」として扱うのが基本です。
注意:-Verb RunAs は UAC を発生させます。承認のない権限昇格は業務フローや監査要件を壊すため、運用ルール(申請・承認・ログ)に従って使用してください。
# 例1:ファイルをノートパッドで開く
Start-Process -FilePath "notepad.exe" -ArgumentList "C:\temp\memo.txt"
# 例2:MSIを管理者でサイレントインストール
Start-Process -FilePath "msiexec.exe" -ArgumentList "/i C:\pkg.msi /qn" -Verb RunAs -Wait
3. 非同期/同期実行と出力管理
同期(-Wait)と非同期の違いを理解し、出力が必要なら別手段で受け取ります。
- 非同期:
Start-Process "app.exe"(起動してすぐ戻る) - 同期:
Start-Process "app.exe" -Wait(終了まで待つ) - 出力取得:起動したプロセスの標準出力をPowerShell側で扱いたい場合、
Start-ProcessではなくInvoke-Expressionや呼び出し演算子&の利用を検討する
よくあるミス:-Wait を付けると「出力が得られる」と期待してしまう点です。Start-Process はプロセス制御(起動・待機など)が主目的で、標準出力の取得には向きません。
注意:長時間ブロッキングする処理を同期で待つと、PowerShellセッションが固まって見えることがあります。自動化ジョブではタイムアウト設計(監視・強制終了・リトライ方針など)を入れる判断が重要です。
# バックグラウンドで起動してProcessオブジェクトを取得
$p = Start-Process -FilePath "ping.exe" -ArgumentList "localhost -n 5" -PassThru
$p.WaitForExit()
4. 管理者権限・Credentialの扱い(エスカレーション)
結論(1行):権限昇格は便利だがリスク大。誰が何を承認するかを明確に。
注意(重要):管理者権限での実行はシステム設定やファイルを変更し得る破壊的操作です。実行前に対象・影響範囲・ロールバック手順を確認し、運用チケット等で承認を得てください。
手順/具体例:
- UACによる昇格:
-Verb RunAsを使用
Start-Process -FilePath "powershell.exe" -Verb RunAs
- 別ユーザー実行:
-Credentialを使用(対話で資格情報を入力)
Start-Process -Credential (Get-Credential) -FilePath "powershell.exe" -ArgumentList "-File C:\script.ps1"
- 自動化ではセキュアなシークレット管理を併用(資格情報の直書き回避)
よくあるミス:
- 平文でパスワードをスクリプトに書く → 重大な漏洩リスク(ログ・履歴・リポジトリ経由で拡散しやすい)
補足:
-Credentialによる実行は、対象マシンのポリシー(例:UAC/ローカルセキュリティ/権限設定)により失敗する場合があります。- 現場の判断ポイント:エスカレーションが本当に必要か、承認フロー(運用チケット等)を通すべきかを必ず検討してください。
5. 実務で役立つ例(インストーラ・ファイル開封・URL起動)
現場の定型作業をStart-Processで自動化すると手戻りが減る。
- インストーラ自動実行:Start-Process msiexec /i /qn -Wait
- URLを既定ブラウザで開く:Start-Process "https://example.com"
- ファイル関連アプリ起動:Start-Process -FilePath "explorer.exe" -ArgumentList "C:\logs"
よくあるミス:サイレントインストール時に戻りコードを確認しないと、失敗を検知できません。
注意(重要):インストールやファイル上書きは業務影響が大きい操作です。破壊的操作を自動化する場合は、事前にバックアップを取得し、関係者の承認を得てから実行してください。
# URLを開く(既定ブラウザで)
Start-Process "https://intranet.company.local"
# サイレントインストールの例(戻り値確認は別途)
Start-Process -FilePath "msiexec.exe" -ArgumentList "/i C:\tools\agent.msi /qn" -Wait
6. トラブルシュートと安全運用のチェックリスト
結論:動かない原因は「権限」「パス」「引数」の3点がほとんどです。順に潰す運用フローを用意します。
- 実行ユーザーとUAC(管理者権限)の要否を確認する
FilePathはフルパスで指定する(どの作業ディレクトリでも同じ挙動にする)ArgumentListの引用符・スペース・エスケープを確認する
- ログ出力(標準出力/標準エラー)と戻りコード取得を運用に組み込む
- テスト環境で動作確認 → 本番は段階展開(小さく当てて広げる)
よくあるミスは、相対パスや作業ディレクトリ依存で失敗するケースです。必要に応じてWorkingDirectoryを明示して解消します。
$p = Start-Process -FilePath "C:\Tools\tool.exe" `
-ArgumentList @("--input", "C:\Data\in.txt", "--flag") `
-WorkingDirectory "C:\Tools" `
-NoNewWindow -PassThru -Wait
# 終了コード(運用上の判定材料)
$p.ExitCode
注意(強い警告):無許可で多数マシンへ一斉実行すると障害を広げる可能性があります。影響範囲が不明な場合は、まず少数台で検証し、停止条件・切り戻し手順・エスカレーションラインを事前に明確化してください。
要約
- Start-Processは外部アプリ起動の汎用ツールで、同期/非同期や作業フォルダを制御できる。
- よく使うオプションは
-FilePath,-ArgumentList,-WorkingDirectory,-Verb,-Wait,-PassThru。 - 出力取得が必要ならStart-Process以外の手法も検討(Invoke-Expressionやリダイレクト)。
- 権限昇格やCredential取り扱いはリスクが高いので、承認・ログ管理・シークレット管理が必須。
- 注意: 本番運用前は必ず段階的検証を行い、上書き・インストール・削除などの破壊的操作を伴う場合は、事前承認とバックアップ確保を徹底する。