Powershell入門 - 05. スクリプト化

# 1. 処理をまとめて実行する
前回、変数を用いることで複数のコマンドレットを連携させることができました。
しかし、この行数が長くなっていくと毎回一行ずつ実行するのは大変です。
そこで今回は、一連の処理の流れをまとめて実行するための方法について学びます。

## 1.1. Windows Powershell ISEの利用
まずは、Windowsのメニューから「Windows Powershell ISE」を探して起動しましょう。
以下のような画面が表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781058/a45a0b01-373d-9e27-a523-0cdcda8ca215.png)

まずは、①～③の各エリアについて説明します。
①は処理をまとめたスクリプトを書くエリアです。
これまで、Powershellに1行ずつ書いていた処理をここにまとめて記述します。

②はPowershellの画面です。
①で書いた処理が実行されると、②の画面に対して1行ずつ処理が流れていきます。
また、②に直接処理を書くことも可能です。

③はコマンドレットを使用するためのサポートをしてくれるアドオンです。
詳しくは後ほど使っていきます。

---
#### 例題1.
①のエリアに以下の処理を記述しなさい。
```powershell
Set-Location D:\powershell\data
```
その後、画面上部の`▶マーク`もしくはF5を押して、スクリプトを実行しなさい。


#### 例題2.
[前回の資料の2.3](./69a20b5280277f42027d#23-%E5%A4%89%E6%95%B0%E3%82%92%E4%BB%8B%E3%81%97%E3%81%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E9%80%A3%E6%90%BA)にかかれている処理を①のエリアに貼り付けなさい。
※例題①で書いたスクリプトは削除すること

スクリプトを実行し、結果を確認しなさい。

---

# 2. スクリプトの保存と実行
作成したスクリプトは保存して後から使うことができます。
早速保存してみましょう。
保存は、画面上部の保存ボタン、もしくは`Ctrl+s`でできます。
D:\powershell直下にscriptフォルダを作成して、ここにscriptをまとめておくと良いでしょう。

---
#### 例題3.
例題2のスクリプトを`D:\powershell\script`フォルダに、test.ps1という名前で保存しなさい。
※.ps1はpowershellスクリプトの拡張子である。

---

## 2.1. 実行ポリシーの変更
保存したスクリプトを実行しようとすると、以下のようなエラーが発生します。

```powershell
(base) PS D:\powershell\data> D:\powershell\script\test.ps1
このシステムではスクリプトの実行が無効になっているため、ファイル D:\powershell\script\test.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.
com/fwlink/?LinkID=135170) を参照してください。
    + CategoryInfo          : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

以下の処理をスクリプトではなく、Powershellに直接書いて実行してみましょう。
```
Get-ExecutionPolicy
```
`Get-ExecutionPolicy`はPowershellの実行ポリシーを確認するためのコマンドレットです。
Powershellには使い方を間違えると、PCを破壊したり乗っ取ったりできるコマンドが用意されています。
そのため、デフォルトではPowershellスクリプトは実行できないようにポリシーで制限されています。

実行ポリシーの種類は以下の通りで安全性の高い順に並んでいます。

| 名称 | 意味 |
| :-- | :-- |
| Restricted | スクリプトは実行不可|
| AllSigned | 署名付きスクリプトのみ実行可能|
| RemoteSigned | ローカルで書かれたスクリプトか署名付きスクリプトは実行可能|
| Unrestricted | すべてのスクリプトを実行可能だが、警告が表示される|
| Bypass | すべてのスクリプトを警告なしで実行可能 |

では、実行ポリシーを`Restricted`から`RemoteSigned`に変更します。
Powershellを管理者モードで起動し、以下のスクリプトを実行します。

```powershell
Set-ExecutionPolicy RemoteSigned
```
確認画面が出てきたら、`Y`を押して`ENTER`でOKです。
先程保存したtest.ps1を実行し、エラーが出てこなければ成功です。

---
#### 例題4.
Windows Powershell ISE上のシェルから実行ポリシーを確認し、
`RemoteSigned`になっていることを確認しなさい。

---

# 3. 開発者向け機能の紹介
Windows Powershell ISEにはスクリプトをつくる人向けの便利な機能が備わっています。
そのうちのいくつかを紹介します。

## 3.1. デバッグ機能
デバッグ機能を使うことで、スクリプトを1行ずつ確認しながら、処理の流れや変数の中身の変化を追うことができます。

デバッグの手順は以下のとおりです。

1. 処理を停止したい行で`F9`を押す(ブレークポイントの設定)
2. スクリプトを実行する(1.で指定した場所で処理が停止する)
3. 変数の中身を確認し、想定通り動いているか確認する
  3.1. 変数にカーソルを合わせて、中身を確認する
  3.2. シェル画面にて変数名を入力し、中身を確認する
4. F10などで処理を進めながら、変数がどう変わるかを追跡する

デバッグで主に使う操作は以下の通りです。

| 操作 | 意味 |
| :-- | :-- |
| F9 | ブレークポイントを設定する/解除する |
| F5 | スクリプトを実行する/次のブレークポイントまで処理をすすめる |
| F10 | 一行だけ処理をすすめる(ステップオーバー)|
| F11 | その行に書かれた関数の中身へ移動する(ステップイン)　|
| Shift + F11 | 関数の中から呼び出し元の処理に戻る(ステップアウト) |

---
#### 例題5.
以下の処理をreidai0505.ps1という名前で保存し、1行目にブレークポイントを設定しなさい。
スクリプトを実行したらF10で1行ずつ処理を進め、変数$arrの中身がどのように変わっていくか調べなさい。

```reidai0505.ps1
$arr = 1..20
$arr[2] = -1
$arr[4] = -2
$arr += 21
$arr += 30..35
Write-Host $arr
```

---

## 3.2. コマンドアドオン機能
先程説明を省略した画面右側の部分についてです。
ここの「名前」と書かれた入力エリアに検索ワードを入力すると、コマンドの絞り込みが行なえます。

試しに`Get-`と入力してみましょう。
`Get-`から始まるコマンドが一覧で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781058/eaaa3866-bc96-e416-2b74-fe3b55275630.png)

では、`Get-Chi`まで入力してGet-ChildItemを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781058/9f3a4681-373a-95b0-be72-86de7c63aa9c.png)

検索結果の下に複数の入力エリアが登場しました。
これは、コマンドレットにわたすことができるパラメータの設定エリアとなっていて、コマンドをすべて入力する代わりに必要なパラメータだけ設定することで、コマンドレットの呼び出しを書くことができます。

では、`Path`パラメータに`.`と入力、`Recurse`のチェックボックスにチェックを入力し、下の「実行」ボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781058/fa6927ff-c030-7c69-722b-188fde499e96.png)

左下のシェル画面に`Get-ChildItem -Path . -Recurse`という処理がわたり、実行結果が表示されました。
このように、コマンドをすべて書かずにも、必要なパラメータを設定してあげると実行したい処理を記述してくれる機能となります。

また、「実行」ボタンの代わりに「コピー」を押すことで、クリップボードに処理がコピーされるので、左上のスクリプト画面に貼り付けて使うことも可能です。

Prev : [04.変数](./69a20b5280277f42027d)
Next : [06.条件ステートメント](./906f5bdc719b34052b46)

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