PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法

- 環境
    - Windows10 Pro 64bit バージョン1803
    - PowerShell 5.1.17134.858

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

# 原因 : 実行ポリシーが初期値のままだから
PowerShellは、ソースファイルに書かれたコードを初期状態では実行できない。
> 実行ポリシーは、PowerShellが読み込む構成ファイルや実行するスクリプトに関する条件を決定します。
> 初期値は「Restricted」で、個々のコマンドは実行できますが、書式設定ファイル(.ps1xml)、モジュールスクリプトファイル(.psml)、およびPowerShellプロファイル(.ps1)を含むすべてのスクリプトファイルの実行が禁止されます。
> [Windows PowerShell逆引きハンドブック](https://www.c-r.com/book/detail/1062)

```powershell
# 実行ポリシーを確認する
PS C:> Get-ExecutionPolicy
Restricted
```

## 対応 : Set-ExecutionPolicyで実行ポリシーを設定する
セキュリティを考えると使い終わったら実行ポリシーは元に戻したほうが良い気がする。

> 1. Windows PowerShellを起動
> 1. Set-ExecutionPolicyコマンドで実行ポリシーを変更
> 1. ps1ファイルを実行
> 1. Set-ExecutionPolicyコマンドで実行ポリシーを戻す
>
> [PowerShellスクリプトを簡単実行 - Qiita](https://qiita.com/biginnings/items/f4e22ad275d9adfc1b57)

が、めんどうくさい・・・のでその時のプロセスだけ有効にして終わったら元に戻るようにスコープを`Process`で設定する。
そうすれば、管理者権限でPowerShellを実行しなくて済むという利点もある。

> スコープを実行中のプロセスに絞れば実行ポリシーを変更できます。
> [管理者権限なしでPowerShellスクリプトを実行する方法 - Qiita](https://qiita.com/alchemist/items/e6706cd425f8f5e5032e)


```powershell
# (書き方)Set-ExecutionPolicy -ExecutionPolicy <実行ポリシー> -Scope <スコープ>
PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック
(https://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

# 確認してみる
PS C:> Get-ExecutionPolicy
RemoteSigned

# もう一度動かしてみる
PS C:> hoge.ps1
動いた！
```

- [Powershellを楽に実行してもらうには - Qiita](https://qiita.com/tomoko523/items/df8e384d32a377381ef9)

### 実行ポリシーの種類
|実行ポリシー|説明|
|:-:|:-:|
|AllSigned|ローカルコンピューターで作成されたスクリプトを含め、すべてのスクリプトと構成ファイルが信頼できる発行元によって署名されている必要があります。|
|Bypass|何もブロックされず、警告やプロンプトも表示されません。|
|RemoteSigned|インターネットからダウンロードしたすべてのスクリプトと構成ファイルが、信頼できる発行元によって署名されている必要があります。Windowsサーバーコンピューターでの既定の実行ポリシーです。|
|Restricted|構成ファイルのロードやスクリプトの実行は行いません。Windowsクライアントでの既定の実行ポリシーです。|
|Undefined|スコープに実行ポリシーが設定されていません。グループポリシーで設定されていないスコープから、割り当てられた実行ポリシーを削除します。すべてのスコープの実行ポリシーがUndefinedの場合、有効な実行ポリシーはRestrictedになります。|
|Unrestricted|PowerShell 6.0以降、これはWindows以外のコンピューターに対する既定の実行ポリシーとなり、変更できなくなりました。すべての構成ファイルをロードし、すべてのスクリプトを実行します。インターネットからダウンロードした署名なしスクリプトを実行すると、実行前に許可を求めるメッセージが表示されます。|
- [Set-ExecutionPolicy - docs.microsoft.com](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7#parameters)
- [PowerShellのExecutionPolicyのスコープとかについて詳しく - Qiita](https://qiita.com/kikuchi/items/59f219eae2a172880ba6)
- [WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)

### スコープの種類
|スコープ|説明|
|:-:|:-:|
|Process|実行ポリシーは現在のPowerShellプロセスのみ影響する|
|CurrentUser|実行ポリシーは現在のユーザーのみ影響する|
|LocalMachine|実行ポリシーはすべてのユーザーに影響する|