こんにちは。チェシャ男です。(-皿-)
今回は、
【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」の編集画面が起動してきました。
このように 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"
↓↓↓↓↓↓↓↓
このように 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 “△△△”
[…] 【Start-Process】PowerShellで別プロセスを起動させる方法 ← WindowsでGit関連のコマンドをAlias登録する […]
[…] 【Start-Process】PowerShellで別プロセスを起動させる方法今回は、【PowerShellで別プロセスとして起動させる方法】についてご紹介します。PowerShell使用中にもう1つPowerShellを立ち上げたい時な […]
[…] 【Start-Process】PowerShellで別プロセスを起動させる方法 […]