PowerShellギャラリーで公開されているモジュールをオフライン環境にインストールしてみる

PowerShellギャラリーで公開されているモジュールを、インターネットに疎通のない環境にインストールしたいといった事があるかもしれません。

この場合、どのような手段でインストールできるのか確認してみます。

## PowerShellギャラリーからのモジュールインストールについて

PowerShellではInstall-Moduleコマンドレットを使い、PowerShellギャラリーで公開されているモジュールを簡単にインストールする事ができます。

[必要なネットワーク エンドポイント](https://learn.microsoft.com/ja-jp/powershell/gallery/how-to/getting-support/troubleshooting-cmdlets?view=powershellget-3.x#required-network-endpoints)

ただし利用するためには上記ページにあるようなネットワーク要件を満たす必要があります。

このため本記事では、インターネットに疎通できない環境へPowerShellギャラリーからモジュールを持ち込むことについて解説します。

なお本記事ではインターネットに疎通できない環境として、RDPでクリップボード共有はできるがインターネット接続のないEC2インスタンスを用意し、ここにモジュールを持ち込みインストールする方法について説明します。

## 参照ドキュメント

- [パッケージの手動ダウンロード](https://learn.microsoft.com/ja-jp/powershell/scripting/gallery/how-to/working-with-packages/manual-download?view=powershell-7.3)

## 今回インストールする環境とインストールモジュール

- Windows Server 2022(AWS上のEC2)
- ImportExcel 7.8.9
- Windows PowerShell 5.1.20348.2582

### モジュールダウンロード と ブロックの許可

- [パッケージの手動ダウンロード](https://learn.microsoft.com/ja-jp/powershell/scripting/gallery/how-to/working-with-packages/manual-download?view=powershell-7.3)

ドキュメントを参照し、手順を進めていきます。

[PowerShell Gallery ImportExcel](https://www.powershellgallery.com/packages/ImportExcel)

まずはインターネットにアクセスできる環境からPowerShell Galleryのサイトにアクセスし、`Manual Download`タブから`Download the raw nupkg file`をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/cae35817-dfe0-8f77-4d8f-4151a1bb91f2.png)

ダウンロードしたファイルのプロパティを確認すると、ファイルがブロックされている記述が表示されます。

まずはこちら許可にチェックをいれてOKを選択し、ブロック設定を解除します。
※参照しているドキュメント上ではこちら`Unblock-File`コマンドレットで許可しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f3af8941-f157-648e-f37e-b85362cb872d.png)

### nupkgファイルの展開

ダウンロードしてきたnupkgについては実体はzip形式となるため、拡張子をnupkgからzipに変更して展開します。

今回、importexcel.7.8.9.zipをimportexcel.7.8.9というフォルダ配下に展開しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e3a3dbf1-03f6-c4e1-e3ee-6e1697d8ed36.png)

### フォルダ名の変更

ドキュメントには既定のフォルダー名は通常、`<name>.<version>`と記載があり、今回展開したフォルダについても、nameがimportexcelとなっており、versionが7.8.9となっている事がわかります。

このためフォルダを<name>だけに変更すればよいので、今回はimportexcel.7.8.9からimportexcelに名前の変更を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/88b3368c-8f6a-e73e-b912-694496a67e9a.png)

## フォルダを配置する

今回、EC2上にインターネットへアクセスできない環境を用意し、そちらにフォルダを配置します。

なお今回、インストールするEC2環境は、RDPで疎通でき、かつ、クリップボード共有を有効にしているため、モジュールをローカル端末からクリップボード経由でコピーして配置しています。

なおフォルダのコピー先については、環境変数PSModulePathで定義されているフォルダ内に配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/43b8c0b8-ed98-a101-2404-4bf8166c0020.png)

配置先のEC2インスタンスで環境変数の確認を行うと、下記の3つのフォルダパスが定義されていました。

- C:\Users\Administrator\Documents\WindowsPowerShell\Modules
- C:\Windows\system32\WindowsPowerShell\v1.0\Modules
- C:\Program Files\WindowsPowerShell\Modules

今回は、`C:\Users\Administrator\Documents\WindowsPowerShell\Modules`にフォルダを配置します。

なお該当環境では、そもそもこのパスが存在していなかったためパスから作成し配置しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6c1945e7-1bed-3e9e-bca0-d8816de6c6d5.png)

## import-moduleで読み込んでみる

`Import-Module importexcel`を実行すると、特に問題なくモジュールがよみこまれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1fc28742-f445-7445-4b4d-a2a474ed728a.png)

## せっかくなのでimportExcelサイトにあるサンプルを実行してみる

[Create a spreadsheet](https://github.com/dfinke/ImportExcel?tab=readme-ov-file#create-a-spreadsheet)

```powershell
$data = ConvertFrom-Csv @"
Region,State,Units,Price
West,Texas,927,923.71
North,Tennessee,466,770.67
East,Florida,520,458.68
East,Maine,828,661.24
West,Virginia,465,053.58
North,Missouri,436,235.67
South,Kansas,214,992.47
North,North Dakota,789,640.72
South,Delaware,712,508.55
"@

$data | Export-Excel .\salesData.xlsx
```

上記サイトにあるサンプルを実行して軽く動かしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e1cd6fb4-a272-7e6a-3837-e8981552c16b.png)

ファイルが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4e29219f-8654-deea-1a17-48c2d2239180.png)

ファイルをexcelがインストールされている端末にコピーして開いてみると、画像のようなエクセルが表示され正常にファイル作成されていました。

今回、目的とするimportExcelは上記手順で問題なくインストールされたようです。

## 総評

そもそもインターネットに疎通できないように制限している環境というのは。

それなりの理由があるからインターネットへの疎通を制限しているだと思います。

そのような環境にインターネットで公開されているモジュールをインストールするケースは稀かと思います。

また安易に持ち込むべきでもないはずですので、どうしても持ち込む必要が出てきた場合はモジュールについて問題ないかはそれなりの判断にはなるかと思います。

ただいざいうときに備えて、PowerShellではこのような方法でPowerShellギャラリーにて公開されているモジュールをオフライン環境に持ち込むことができるって事は認識しておいてよいかと思います。