Powershell入門 - 11.プロセスの操作

今回は、他のアプリケーションの起動・停止を行うためのコマンドレットや処理を学びます。  

# 1. プロセスの起動
## 1.1. アプリを起動する
手始めにPowershellから、メモ帳を起動してみましょう。  
`Start-Process`コマンドレットを使用することで、アプリを起動できます。

```powershell
Start-Process notepad
```
notepadはメモ帳のアプリ名になります。(正確にはnotepad.exeです)  
Start-Processの後ろに**アプリ(.exeファイルなど)のパス**を書くことで、そのアプリを起動させることができます。  

#### 余談
「アプリのパス」を書くとファイルが実行されると説明しましたが、notepadは現在のカレントディレクトリ内にない(はず)なので、正しくアプリのパスが書かれていません。  
Windowsには**環境変数**というWindowsの実行に使用する変数を格納するものがあります。
そして、「Pathという名前の環境変数に設定されたフォルダ内のアプリについては、ファイル名の指定のみで起動可能になる」ように設定されています。  

環境変数については、以下の記事がわかりやすかったです。
[「PATH を通す」の意味をできるだけわかりやすく説明する試み](https://qiita.com/sta/items/63e1048025d1830d12fd)

実行可能なexeファイルであれば、どんなファイルでもpowershellから起動可能ですが、代表的なものを以下に載せておきます。

|アプリ名|アプリ名(日本語)|
|:--|:--|
|notepad | メモ帳 |
|mspaint | ペイント |
|calc|電卓|
|chrome|Chrome(要インストール)|
|excel|Excel(要インストール)|
|word|Word(要インストール)|

---
#### 例題1.
Powershellから電卓を起動しなさい。  

#### 例題2.
アプリの起動時にオプションで`-ArgumentList`パラメータを指定することができる。  
例えばメモ帳では`-ArgumentList`にファイルのパスを指定することで、指定されたファイルを開いた状態でメモ帳が開始される。

Start-Processを使って、`D:\powershell\data\sample1.txt`をメモ帳で開きなさい。

---

## 1.2. ソースコードを実行する
プログラミング言語を覚えたての人の多くは、JavaやPythonなどのプログラムは開発環境(Ecllipse, Visual Studio)の実行ボタンからプログラムを実行していることでしょう。  
しかしながら、多くのプログラミングはPowershellなどのシェルから実行することが可能です。  

このページを閲覧していただいた方が準備している実行環境が様々なので、今回はPowershellを実行する例を記載します。
ですが、どの言語も同じように実行可能であることを覚えておいてください。

まずは、以下のスクリプトを`exec01.ps1`という名前で`D:\powershell\script`に保存しましょう。

```powershell
$a = "abc", "def", "ghi"
foreach($el in $a){
    Write-Host $el
}
```

このファイルを呼び出す処理は以下のとおりです。

```powershell
powershell D:\powershell\script\exec01.ps1
```

プログラムを呼び出す場合、①そのプログラミング言語の実行コマンド、②実行するファイル名 をスペース区切りで書いてあげればOKです。  

例えば、Pythonのファイルを実行したい場合は、(環境により若干異なりますが)以下のように書きます。
```powershell
python hoge.py
```

これまでの開発環境による実行と比べ、このようにコマンドで実行するメリットは何でしょうか？
いくつかあると思いますが、筆者としては大きく2つの点が思いつきます。

### 1.2.1. 実行結果をファイルに保存する
[09. パイプライン](https://qiita.com/daifukusan/items/53cb7275a044be3256aa)で覚えた操作を使うと、実行結果は簡単にファイルに保存できます。(Out-Fileはファイルへの書き込み用のコマンドレットです)  

```powershell
powershell D:\powershell\script\exec01.ps1 | Out-File D:\powershell\data\exec01.log
```

上記の例ではPowershellからPowershellのスクリプトを呼んでいるので面白みがありませんが、他の言語の場合はどうでしょうか？  
対象のソースコードに変更を加えずに、実行結果を保存できるのは1つのメリットだと思います。

### 1.2.2. スケジューラと連動する
Windowsにはタスクスケジューラという機能があります。  
この機能を使うことで、毎日同じ時間に決まった処理を実行させるなどが可能になります。  
そして、上で説明したようなコマンドをスケジューラにわたすことで、毎日決まった時間にC言語やJavaで定義された処理を実行させることができます。  

以上のような理由から、コマンドによるプログラムの実行方法も覚えておいて損はないでしょう。

#### 例題3.
以下の一連の処理を`exec02.ps1`という名前で`D:\powershell\script`に保存しなさい。

1. 現在のカレントディレクトリをD:\powershell\dataに変更する(Set-Locationを使用)
2. 現在のカレントディレクトリを取得し、変数pathに格納(Get-Locationを使用)
3. 変数pathのフォルダの中身を表示する(Get-ChildItemを使用)

`exec02.ps1`を開発環境を使わずに、powershellのコンソール画面から起動しなさい。  
また、この実行結果を`D:\powershell\data\exec02.log`に保存しなさい。

# 2. プロセスを確認・停止する
以下のコマンドを実行して、メモ帳を3つ起動しましょう。

```powershell
Start-Process notepad
Start-Process notepad
Start-Process notepad
```

`Start-Process`がプロセスを起動するコマンドレットであれば、停止するためのコマンドレットとして`Stop-Process`が用意されています。

Start-Processと同じように使うのであれば、以下のように書けばプロセスを停止できるでしょうか。
```powershell
Stop-Process notepad
```
実行するとわかりますが、上記のコマンドはエラーになります。  
これは、どのメモ帳を閉じればよいか、アプリ名だけでは判断できないためです。  

実はすべての起動中のプロセスには、**プロセスID**という一意のキーが割り当てられており、Stop-Processにはこのキーを渡す必要があります。  

ではまず、このプロセスIDを調べてみましょう。  
そのためには、`Get-Process`コマンドレットを使用します。

```powershell
Get-Process                 # 起動中のアプリを全件取得
Get-Process notepad         # アプリ名が分かる場合は、アプリ名で指定
Get-Process -Name notepad   # ↑の名前付き引数Ver
```

Get-Processは引数なしだと、起動中のアプリの情報を全件取得しますが、Name引数を指定することで対象アプリのみに絞り込むことができます。
実行結果の`Id`列に書かれた数字がこのプロセスのプロセスIDになります。

この情報を使って、`Stop-Process`は以下のように使います。
```powershell
Stop-Process xxxxx        # xxxxxにプロセスIDを指定
Stop-Process -Id xxxxx    # ↑の名前付き引数Ver
```

では、例題で動きを確かめてみましょう。
**注意** 
プロセスIDを打ち間違えて、別のアプリを停止しないようにしましょう。

---
#### 例題4.
先程起動したnotepadのプロセスをすべて停止しなさい。

---

Prev : [10.関数](./42c823687bc116f0b7ce)
Next : [12.ファイルの参照・更新](./fcc0f8c9ee0c47c68a72)

[目次へ戻る](./926b8053a031539437a3)