閉じる

PowerShellのStart-Processでアプリを起動する方法:引数指定・管理者実行・待機まで解説

Windowsの運用管理や業務自動化において、PowerShellから外部アプリケーションを起動する操作は非常に頻度が高いタスクです。

単純にプログラムを立ち上げるだけでなく、特定の引数を渡したり、管理者権限で実行したりといった柔軟な制御が求められる場面も少なくありません。

PowerShellには実行ファイルを直接指定する方法もありますが、より詳細な制御が可能なStart-Processコマンドレットの習得は不可欠と言えます。

本記事では、Start-Processを使用してアプリケーションを自在に操るための具体的な手法を解説します。

Start-Processの基本構文と実行方法

Start-Processは、ローカルコンピュータ上で1つ以上のプロセスを開始するためのコマンドレットです。

最もシンプルな使い方は、起動したい実行ファイルの名前またはパスを指定することです。

以下のコードは、Windows標準のテキストエディタである「メモ帳」を起動する例です。

PowerShell
# メモ帳を起動する最もシンプルなコマンド
Start-Process -FilePath "notepad.exe"

このコマンドを実行すると、新しいメモ帳のウィンドウがデスクトップに表示されます。

-FilePathパラメータは必須の引数であり、実行ファイルへのフルパスまたは環境変数パスが通っているファイル名を指定します。

もしパスの中にスペースが含まれる場合は、ダブルクォーテーションで囲む必要がある点に注意してください。

エイリアスと省略記法

Start-Processには「saps」や「start」といったエイリアス(別名)が用意されています。

対話型のコンソール操作ではこれらを使用すると入力を短縮できますが、スクリプト作成時には可読性を高めるためにフルネームを使用するのが一般的です。

また、-FilePathというパラメータ名自体も、第一引数であれば省略することが可能です。

引数を指定してアプリを起動する(-ArgumentList)

多くのアプリケーションは、起動時にコマンドライン引数を受け取ることで特定の動作を指定できます。

Start-Processで引数を利用する場合は、-ArgumentListパラメータを使用します。

単一または複数の引数を渡す

引数は文字列として指定するか、複数の引数をカンマ区切りの配列として指定することができます。

例えば、特定のファイルをメモ帳で開きたい場合は、そのパスを引数として渡します。

PowerShell
# 指定したテキストファイルをメモ帳で開く
Start-Process -FilePath "notepad.exe" -ArgumentList "C:\Temp\test.txt"

複数のオプションを指定するブラウザの起動例などは以下のようになります。

PowerShell
# Microsoft Edgeをインプライベートモードで特定のURLを開く
Start-Process -FilePath "msedge.exe" -ArgumentList "--inprivate", "https://www.example.com"

引数にスペースが含まれる場合の対処法

引数の中にスペースが含まれるパスなどを指定する場合、クォーテーションの扱いに注意が必要です。

PowerShell内での文字列定義と、アプリケーション側に渡される文字列の解釈が異なるためです。

このような場合は、エスケープしたダブルクォーテーションを使用して引数を囲むのが確実な方法です。

PowerShell
# パスにスペースを含むファイルを引数に指定する例
$targetFile = 'C:\My Documents\memo.txt'
Start-Process -FilePath "notepad.exe" -ArgumentList "`"$targetFile`""

管理者権限で実行する(-Verb RunAs)

システム設定の変更やインストーラーの実行など、高い特権が必要な場合には管理者としてアプリを起動しなければなりません。

PowerShellコンソール自体を管理者として開き直す必要はなく、コマンドのオプションでこれを制御できます。

-VerbパラメータにRunAsを指定することで、ユーザーアカウント制御(UAC)のダイアログを表示させ、管理者権限で実行できます。

PowerShell
# 管理者権限でPowerShellを新しく起動する
Start-Process -FilePath "powershell.exe" -Verb RunAs

この機能は、Windows固有の動詞(Verb)を利用した仕組みです。

実行ファイルの種類によっては、他にも「Print(印刷)」などの動詞が使用できる場合があります。

プロセスの終了を待機する(-Wait)

自動化スクリプトにおいて、起動したアプリケーションが終了するまで次の処理に進みたくない場合があります。

デフォルトでは、Start-Processはプロセスを開始するとすぐに制御をPowerShellに戻してしまいます。

この挙動を制御し、アプリケーションが閉じるまでスクリプトを一時停止させるのが-Waitパラメータです。

PowerShell
# メモ帳が閉じられるまでスクリプトの続行を待つ
Start-Process -FilePath "notepad.exe" -Wait
Write-Host "メモ帳が終了しました。"

インストーラー(.exeファイル)を連続して実行するセットアップスクリプトなどでは、このパラメータが必須となります。

もし-Waitを使用しない場合、複数のインストーラーが同時に立ち上がり、リソースの競合やエラーが発生する恐れがあります。

作業ディレクトリを指定する(-WorkingDirectory)

アプリケーションの中には、実行時のカレントディレクトリ(作業フォルダ)に特定のファイルが存在することを前提としているものがあります。

その場合、単にフルパスで実行ファイルを指定するだけではエラーになることがあります。

-WorkingDirectoryを使用することで、そのアプリケーションが動作する際の基点となるフォルダを明示的に指定できます。

PowerShell
# 作業ディレクトリをC:\Dataに設定して自作ツールを実行する
Start-Process -FilePath "C:\Tools\app.exe" -WorkingDirectory "C:\Data"

これにより、アプリケーション内部で相対パスが使われていても正しく動作させることが可能になります。

ウィンドウの状態を制御する(-WindowStyle)

バックグラウンドで処理を行いたい場合や、デスクトップを邪魔したくない場合にはウィンドウの表示スタイルを変更できます。

-WindowStyleパラメータには、以下の4つの値を指定できます。

設定値説明
Normal通常のサイズと位置でウィンドウを表示します(既定値)。
Hiddenウィンドウを非表示にしてプロセスを開始します。
Minimizedウィンドウを最小化した状態で開始します。
Maximizedウィンドウを最大化した状態で開始します。

特に、ユーザーの操作を介在させないバッチ処理では「Hidden」が重宝されます。

ただし、GUIを持つアプリを非表示にすると、エラーが発生しても気づきにくいというデメリットがあるため注意してください。

PowerShell
# 非表示モードでスクリプトファイルを実行する
Start-Process -FilePath "powershell.exe" -ArgumentList "-File C:\Scripts\task.ps1" -WindowStyle Hidden

プロセスの情報を取得する(-PassThru)

起動したプロセスのID(PID)を取得したり、後からそのプロセスを強制終了させたりしたい場合があります。

通常、Start-Processは何も値を返しませんが、-PassThruパラメータを付けると「System.Diagnostics.Process」オブジェクトを返却します。

PowerShell
# 起動したプロセスのオブジェクトを変数に格納
$proc = Start-Process -FilePath "notepad.exe" -PassThru

# プロセスIDを表示
Write-Host "起動したプロセスのIDは $($proc.Id) です。"

# 5秒後にスクリプトからこのメモ帳を終了させる
Start-Sleep -Seconds 5
$proc.Kill()

このオブジェクトを利用することで、プロセスの開始時間やメモリ使用量の監視、強制終了といった高度な制御が可能になります。

標準出力とエラー出力のリダイレクト

コンソールアプリケーションを実行する際、その出力結果をファイルに保存したいケースがあります。

Start-Processには、標準出力をリダイレクトするためのパラメータが用意されています。

  • -RedirectStandardOutput:標準出力を指定したファイルに書き込みます。
  • -RedirectStandardError:エラー出力を指定したファイルに書き込みます。
PowerShell
# ipconfigの結果をファイルに出力する
Start-Process -FilePath "ipconfig.exe" -ArgumentList "/all" -RedirectStandardOutput "C:\Temp\network_info.txt" -NoNewWindow -Wait

-NoNewWindowパラメータを併用することで、新しいコンソールウィンドウを開かずに現在のウィンドウ内で(あるいは非表示で)処理を完結させることができます。

Start-Processと「&(呼出演算子)」の違い

PowerShellで外部コマンドを実行する方法には、Start-Processの他に&(アンパサンド)を使った呼出演算子があります。

どちらを使うべきか迷うことが多いため、それぞれの特徴を整理します。

呼出演算子(&)の特徴

呼出演算子は、現在のコンソールセッション内で直接プログラムを実行します。

デフォルトで「同期実行」となるため、プログラムが終了するまで次のコマンドは実行されません。

また、出力(テキストデータ)を直接変数に代入したり、パイプラインで別のコマンドに渡したりするのが容易です。

PowerShell
# 呼出演算子での実行例(出力を変数で受け取れる)
$result = & "ipconfig.exe" /all

Start-Processを選ぶべき場面

対して、Start-Processは以下のような「プロセス自体の制御」が目的の場合に適しています。

1. 管理者権限での実行が必要なとき。

2. 別ウィンドウとして独立させて起動したいとき。

3. GUIアプリケーション(Excelやブラウザなど)を起動するとき。

4. 起動時のウィンドウ状態(最小化や非表示)を細かく制御したいとき。

テキストベースのコマンドツールを組み合わせて処理を行うなら呼出演算子を、アプリケーションを「環境」を含めて制御したいならStart-Processを選ぶのがベストプラクティスです。

実践的な活用例:ソフトウェアのサイレントインストール

IT資産管理やPCのキッティング作業では、複数のソフトウェアを自動でインストールするスクリプトがよく作成されます。

ここでは、Start-Processの各パラメータを組み合わせた実践的なコード例を紹介します。

PowerShell
# インストーラーのパスと引数を定義
$installerPath = "C:\Source\SoftwareSetup.exe"
$silentArgs = "/S /v/qn" # サイレントインストール用の一般的な引数例

# 管理者権限で起動し、終了を待機する
try {
    $process = Start-Process -FilePath $installerPath -ArgumentList $silentArgs -Verb RunAs -Wait -PassThru
    
    if ($process.ExitCode -eq 0) {
        Write-Host "インストールが正常に完了しました。" -ForegroundColor Green
    } else {
        Write-Warning "インストールは完了しましたが、終了コードは $($process.ExitCode) でした。"
    }
} catch {
    Write-Error "プロセスの起動中にエラーが発生しました: $($_.Exception.Message)"
}

このように、-Waitで確実に完了を待ち、-PassThruで得た終了コード(ExitCode)をチェックすることで、堅牢な自動化スクリプトを構築できます。

トラブルシューティングと注意点

Start-Processを使用する際に遭遇しやすいトラブルとその対策についても触れておきます。

引数が正しく認識されない

最も多いトラブルは、引数のクォーテーション関連です。

-ArgumentListに渡す文字列が、意図した通りに分割されてアプリに伝わっているか確認しましょう。

複雑な引数が必要な場合は、一度すべての引数を一つの変数に組み立ててから渡すと見通しが良くなります。

パスが見つからないエラー

-FilePathに指定したファイルがカレントディレクトリにない場合、フルパスで指定しない限りエラーになります。

スクリプト内でパスを扱う際は、$PSScriptRoot(スクリプト自身の保存場所)を活用して動的にパスを生成すると、環境依存のエラーを減らせます。

PowerShell
# スクリプトと同じフォルダにあるexeを実行する
$exePath = Join-Path $PSScriptRoot "mytool.exe"
Start-Process -FilePath $exePath

Waitが効かないケース

実行したファイルが「ランチャー」であり、別のプロセスを起動して自身はすぐに終了してしまうタイプの場合、-Waitはランチャーの終了時点で完了してしまいます。

この場合、本来の目的のプロセスが起動し続けていてもPowerShellは先へ進んでしまいます。

このような特殊なアプリを扱う場合は、プロセスの名前を監視するループ処理などを別途実装する検討が必要です。

まとめ

PowerShellのStart-Processコマンドレットは、単なるアプリ起動ツール以上の強力な機能を備えています。

引数の受け渡し、管理者権限の付与、終了待機、ウィンドウ制御といった多彩なパラメータを使いこなすことで、複雑なWindows操作を安全かつ確実に自動化できます。

特に、-ArgumentListのクォーテーションの扱いと、-Waitによる同期処理の重要性を理解しておくことが、安定したスクリプト作成の第一歩となります。

今回紹介したテクニックを参考に、日々の業務プロセスやシステム管理の効率化に役立ててください。

より高度な制御が必要な場合は、-PassThruで取得できるプロセスオブジェクトのプロパティやメソッドを詳しく調べてみることをおすすめします。

URLをコピーしました!