【Start-Process】PowerShellで別プロセスを起動させる方法

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShellで別プロセスとして起動させる方法】

についてご紹介します。

PowerShell の使用中にもう1ウィンドウ PowerShell を立ち上げたい時やスクリプト内であるプログラムを多重起動させたい時などは Start-Process コマンドレットを使用することで実現できます。

さらに、起動時に「管理者として実行」したい場合はこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/start-process-runas/”]

Start-Processでプロセスを開始する

プロセスを開始するコマンドレットに

Start-Process

というものがあります。

【コマンドレット】

Start-Process

【オプション】

パターン1
-FilePath                        <実行ファイルパス>
-ArgumentList                <開始プロセスの引数>
-Credential                     <ユーザ情報>
-WorkingDirectory          <string>
-LoadUserProfile
-NoNewWindow
-PassThru
-RedirectStandardError   <プロセス上のエラー出力先>
-RedirectStandardInput   <プロセスへの入力ファイル>
-RedirectStandardOutput <プロセスからの出力ファイル>
-WindowStyle                 <ウィンドウの状態>
-Wait
-UseNewEnvironment

パターン2
-FilePath                         <実行ファイルパス>
-ArgumentList                 <開始プロセスの引数>
-WorkingDirectory           <プロセスの実行場所>
-PassThru
-Verb                             <プロセス開始時の動作>
-WindowStyle                 <ウィンドウの状態>
-Wait

【入力】

None

【出力】

None
System.Diagnostics.Process

【エイリアス】

saps
start

プロセスとは何か」については「プロセスとは…」をご覧下さい。

実行ファイルを指定してプロセスを開始する

Start-Process コマンドレットではプログラムの実行ファイルを指定して新たにプロセスを立ち上げることができます。

以下のように実行可能なファイル(.exeなど)を指定するとプロセスが開始されます。

Start-Process -FilePath <実行ファイルフルパス>

試しにメモ帳を起動してみます。メモ帳の実行ファイルは、

C:\Windows\System32\notepad.exe

に保存されています。

PS C:\work> #メモ帳を起動
PS C:\work> Start-Process -FilePath C:\Windows\System32\notepad.exe
PS C:\work>
PS C:\work> #メモ帳が起動しているか確認
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    141       7     4132      11148    73     0.05   5044   1 notepad

Get-Process コマンドレットで確認しているように「notepad」が起動していることが確認できますね。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/get-process/”]

また、先ほどは実行ファイルのフルパスを指定しましたが環境変数\Pathによって実行ファイルまでのファイルパスが通っていればファイル名だけで起動することもできます。

環境変数\Pathは、

シェル(PowerShell やコマンドプロンプト)が入力されたコマンドの実行ファイルを探すために設定するもの

の事を言います。

つまり環境変数\Pathが通っている場所に実行ファイルがあれば PowerShell などからファイル名だけを指定して起動できるんです。

PS C:\work> #環境変数Pathを確認
PS C:\work> (Get-Item Env:\Path).value
%SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\WindowsPowerShell\v1.0\;

PS C:\work> #メモ帳をファイル名だけで起動
PS C:\work> Start-Process -FilePath notepad.exe
PS C:\work>
PS C:\work> #メモ帳が起動しているか確認
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    142       7     4164      11188    73     0.19   5712   1 notepad

さらには、Windows では実行ファイル拡張子の補完機能があるので

「notepad.exe」⇒「notepad」

と略すことも可能です。

PS C:\work> #補完可能な実行ファイル拡張子
 (Get-Item Env:\PATHEXT).value
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PS C:\work>
PS C:\work> #ファイル名(拡張し無)で開始
PS C:\work> Start-Process -FilePath notepad
PS C:\work>
PS C:\work> #メモ帳が起動しているか確認
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    143       7     4288      11340    73     0.09   5528   1 notepad

という方法でもプロセスを起動することができます。

実行ファイルじゃないファイルを起動したら…

Start-Process コマンドレットでは実行ファイルじゃないテキストなどの通常のファイルを指定した場合はどうなるのでしょうか。

「Hoge.txt」というテキストファイルをStart-Processで起動してみましょう。

PS C:\work> #Hoge.txtを指定
PS C:\work> Start-Process -FilePath .\Hoge.txt

と実行してみるとメモ帳で「Hoge」の編集画面が起動してきました。

Hogeというテキストファイル-チェシャわら

このように Start-Process で実行ファイル以外のファイルを別プロセスとして立ち上げると、そのファイルに関連付けられた「既定のプログラム」で起動します。

ファイルをダブルクリックして開いた時と同じ状態で起動します。

ファイルの既定のプログラムは

コントロール パネル

⇒プログラム

⇒既定のプログラム

⇒ファイルの種類またはプロトコルへの関連付け

を見ることで確認することができます。

実行ファイルに引数を渡す方法

-ArgumentList” オプションを使用することで起動するプロセスの実行ファイルに引数を渡すことができます。

例えばメモ帳 (notepad) 起動時に引数として「○○.txt」というテキストファイルを引数として設定すると「○○.txt」というファイルの編集画面が起動します。

Start-Process -FilePath notepad -ArgumentList ○○.txt

実際にファイルを指定してみると、

PS C:\work> #「C:\work\Argument.txt」を渡す
PS C:\work> Start-Process -FilePath notepad -ArgumentList "C:\work\Argument.txt"

↓↓↓↓↓↓↓↓

引数ありのHogeファイル-チェシャわら

このように Argument.txt ファイルが開きます。

ちなみに、引数に” “(スペース)が入ると下のようにエラーになります。

PS C:\work> Start-Process -FilePath notepad -ArgumentList C:\work\Arg ument.txt
Start-Process : A positional parameter cannot be found that accepts argument 'ument.txt'.
At line:1 char:1
+ Start-Process -FilePath notepad -ArgumentList C:\work\Arg ument.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand

引数にスペースが入る場合は、””(ダブルクウォート)”(シングルクウォート)で囲むことに注意してください。

別プロセスでコマンドレットを実行する

“-ArgumentList” をうまく使用することで別のプロセスとしてコマンドレットを実行することができます。

起動するプロセスに PowerShell の実行ファイルを指定し、その引数に実行するコマンドレットを指定します。

PowerShell の実行ファイルは

C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe

に格納されています。

また「powershell.exe」は “-command(-cで省略可)”により、起動と同時に実行するコマンドレットを受け取ることができます。

つまり、引数には

“-command 実行したいコマンドレット

を指定します。実際に試してみましょう。

PS C:\work> #別プロセスで「Get-Date」してみる
PS C:\work> Start-Process -FilePath powershell.exe -ArgumentList "-command Get-Date"

別プロセスでコマンドレットが実行されたことがわかりましたか?

きっとウィンドウが立ち上がって一瞬で消えていったかと思います 笑

上記方法で立ち上げた PowerShell のプロセスは引数で渡されたコマンドレットを実行すると終了します。この方法は「別プロセスで多重コピーをする」といったスクリプト時に役に立つので是非活用していてください。

別プロセスでコマンドレットが実行された後、ウィンドウを残したければ ”-Noexit(-noeで省略可)”オプションも指定してあげましょう。

PS C:\work> #別プロセスで「Get-Date」してみる
PS C:\work> Start-Process -FilePath powershell.exe -ArgumentList "-noexit -command Get-Date"

今紹介した方法では別プロセスとして実行する際に新しくウィンドウが立ち上がしまいます。ウィンドウは立ち上げずバックグラウンドで実行したい場合はこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/start-process-window/”]

まとめ

別のプロセスを起動する場合はは

Start-Process -FilePath ○○ <オプション色々>

を使用する。

○○に実行ファイルを指定すると別プロセスで起動する
○○に普通のファイルを指定すると既定のプログラムで実行される

起動時に引数を渡したい場合は以下のオプションを使用する

-ArgumentList “△△△”

2 COMMENTS

コメントを残す

メールアドレスが公開されることはありません。