PowerShellでのWinGetによる環境構築

# はじめに

　PowerShellのアップグレードから、WinGetでアプリをインストールして`g++`コマンドを実行するまで。ついでに、その他諸々のアプリのインストールや設定など。

# PowerShell

## 最新版にしよう

　とりあえず最新にしておきたいよね。PowerShellを起動する度に、下記のメッセージが表示されるのも煩わしいし。

 > 新機能と改善のために最新の PowerShell をインストールしてください!
 
　 という訳で最新版をインストールする。まずは、現在のPowerShellのバージョンを確認しよう。そのために使用するのは`$PSVesionTable`変数だ。これは変数であって、PowersShellのコマンドではない。

　ちなみに、PowerShellのコマンドはコマンドレット(cmdlets)という。基本的に変数やコマンドレットの大文字、小文字はあまり区別されないようだ。先程の`$PSVesionTable`変数も`$psversiontable`や`$PSVERSIONTABLE`と書いても問題ない。

https://learn.microsoft.com/ja-jp/powershell/scripting/powershell-commands?view=powershell-7.5

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_case-sensitivity?view=powershell-7.5

```console:$PSVersionTable
PS C:\Users\dorayaki> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.5369
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.5369
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

　最初に入っていたのはWindows PowerShell 5.1だったようだ。現在はPowerShell 7なので、最新版にアップグレードしよう。

## 最新版を検索

　WinGetを使ってPowerShellの最新版を検索してみる。`winget search 調べたいもの`で、名前やID、タグなどで引っ掛かるものが検索できる。

```console:PowerShellの最新版を検索
PS C:\Users\dorayaki> winget search Microsoft.PowerShell
名前               ID                           バージョン ソース
------------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.4.6.0    winget
PowerShell Preview Microsoft.PowerShell.Preview 7.6.0.2    winget
```

　普通のPowwerShellでも、Preview版でも好きなのを選べばいいので、とりあえず普通の安定してそうな方をインストールする。ちなみにPowerShellでWinGetを実行した場合、下図のように文字化けすることがある。
 
![PowerShell文字化け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/e439eb7a-1e75-8218-ee84-da266bf8cd3f.png)

　デフォルトでは通常時のフォントは「ＭＳ ゴシック」なのたが、何故かWinGet実行中のフォントは違うフォントになることが原因のようだ。私の環境では「Lucida Console」だったかな。とりあえず、これを「ＭＳ ゴシック」に直せば下図の通り文字化けは直る。

![PowerShell文字化け_対処後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/cc9086fc-b2ba-eb8a-880f-13a22ca6c933.png)

　これに関しては下記サイトが詳しかったです。

https://boonx4m312s.hatenablog.com/entry/2023/01/20/180000

## インストール

　インストールしたいものが決まったので`winget install`でインストールしよう。

```console
PS C:\Users\dorayaki> winget install --id Microsoft.PowerShell --source winget
見つかりました PowerShell [Microsoft.PowerShell] バージョン 7.4.6.0
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
```

　こうして、無事にPowerShell 7がインストールされた。

![最近追加されたもの.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/5bd82517-efec-31c8-5a25-0c32d975163d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/f25cbad7-1604-b407-ef5e-7c06a8c51c46.png)

　なお、スタートメニューでPowerShellと調べると下図のように表示される。これから分かるように、新しくインストールしたPowerShell 7と、従来標準搭載されていたPowerShell（下図でのWindows PowerShell）は別物である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/023e54a5-fb48-afd4-48b9-723ff5ea311d.png)

　Windows PowerShellとかPowerShell Core 6だとか、PowerShell 7だとかの話は下記の記事だったり、PowerShellの英語版Wikipediaがまとまってて良さそう。

https://japan.zdnet.com/article/35135464/

## アップデート/アンインストール

`winget upgrade パッケージ名`
`winget uninstall パッケージ名`

　upgradeが必要なものを表示するには、単に`winget upgrade`と実行する。必要なものすべてをインストールする場合は`winget upgrade --all`を実行する。

## PowerShellのwhere

　コマンドプロンプトだと、ソフトがどこにインストールされているのかwhereで調べていた。PowerShellでは`Get-Command`らしい。実行結果でVersionが表示されるが、これはwingetで表示されるVersionが表示されるわけでもないらしい。

```console
PS C:\Users\dorayaki> Get-Command nvim

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     nvim.exe                                           0.0.0.0    C:\Program Files\Neovim\bin\nvim.exe
```

## -e、--exactオプション

　ネットでWinGetによるインストールなどを調べていると、よく`-e`オプションを指定したコマンドを目にした。これは、指定した文字列と完全に一致するものを検索するオプションのようだ。

```console:一致するものがあった場合
PS C:\Users\dorayaki> winget search Microsoft.PowerShell -e
名前       ID                   バージョン ソース
--------------------------------------------------
PowerShell Microsoft.PowerShell 7.4.6.0    winget
```

```console:一致するものがない場合
PS C:\Users\dorayaki> winget search Microsoft.Powershell -e
入力条件に一致するパッケージが見つかりませんでした。
```

　こうして自分なりに調べたものをまとめてみたものの、公式を見るのが最も信頼できて、まとまっている気がするよね。

https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4

# その他ソフトのインストール

## WinLibs

　Make、GCC、MinGW-w64、LLVMなど色々と入ってるみたいでよさそう。インストールには1時間くらい掛かった。

<details><summary>winget install BrechtSanders.WinLibs.POSIX.UCRT.LLVM</summary>

```console
PS C:\Users\dorayaki> winget install BrechtSanders.WinLibs.POSIX.UCRT.LLVM
見つかりました WinLibs (POSIX threads, UCRT runtime, LLVM included) [BrechtSanders.WinLibs.POSIX.UCRT.LLVM] バージョン 14.2.0-19.1.1-12.0.0-r2
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://github.com/brechtsanders/winlibs_mingw/releases/download/14.2.0posix-19.1.1-12.0.0-ucrt-r2/winlibs-x86_64-posix-seh-gcc-14.2.0-llvm-19.1.1-mingw-w64ucrt-12.0.0-r2.zip
  ██████████████████████████████   360 MB /  360 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
コマンド ライン エイリアスが追加されました: "addr2line"
コマンド ライン エイリアスが追加されました: "amdgpu-arch"
コマンド ライン エイリアスが追加されました: "ar"
コマンド ライン エイリアスが追加されました: "as"
コマンド ライン エイリアスが追加されました: "bugpoint"
コマンド ライン エイリアスが追加されました: "c++"
コマンド ライン エイリアスが追加されました: "c++filt"
コマンド ライン エイリアスが追加されました: "ccache"
コマンド ライン エイリアスが追加されました: "clang"
コマンド ライン エイリアスが追加されました: "clang++"
コマンド ライン エイリアスが追加されました: "clang-apply-replacements"
コマンド ライン エイリアスが追加されました: "clang-change-namespace"
コマンド ライン エイリアスが追加されました: "clang-check"
コマンド ライン エイリアスが追加されました: "clang-cl"
コマンド ライン エイリアスが追加されました: "clang-cpp"
コマンド ライン エイリアスが追加されました: "clangd"
コマンド ライン エイリアスが追加されました: "clang-doc"
コマンド ライン エイリアスが追加されました: "clang-extdef-mapping"
コマンド ライン エイリアスが追加されました: "clang-format"
コマンド ライン エイリアスが追加されました: "clang-include-cleaner"
コマンド ライン エイリアスが追加されました: "clang-include-fixer"
コマンド ライン エイリアスが追加されました: "clang-installapi"
コマンド ライン エイリアスが追加されました: "clang-linker-wrapper"
コマンド ライン エイリアスが追加されました: "clang-move"
コマンド ライン エイリアスが追加されました: "clang-nvlink-wrapper"
コマンド ライン エイリアスが追加されました: "clang-offload-bundler"
コマンド ライン エイリアスが追加されました: "clang-offload-packager"
コマンド ライン エイリアスが追加されました: "clang-pseudo"
コマンド ライン エイリアスが追加されました: "clang-query"
コマンド ライン エイリアスが追加されました: "clang-refactor"
コマンド ライン エイリアスが追加されました: "clang-rename"
コマンド ライン エイリアスが追加されました: "clang-reorder-fields"
コマンド ライン エイリアスが追加されました: "clang-repl"
コマンド ライン エイリアスが追加されました: "clang-scan-deps"
コマンド ライン エイリアスが追加されました: "clang-tblgen"
コマンド ライン エイリアスが追加されました: "clang-tidy"
コマンド ライン エイリアスが追加されました: "cmake"
コマンド ライン エイリアスが追加されました: "cmcldeps"
コマンド ライン エイリアスが追加されました: "count"
コマンド ライン エイリアスが追加されました: "cpack"
コマンド ライン エイリアスが追加されました: "cpp"
コマンド ライン エイリアスが追加されました: "cppcheck"
コマンド ライン エイリアスが追加されました: "ctags"
コマンド ライン エイリアスが追加されました: "ctest"
コマンド ライン エイリアスが追加されました: "diagtool"
コマンド ライン エイリアスが追加されました: "dlltool"
コマンド ライン エイリアスが追加されました: "dllwrap"
コマンド ライン エイリアスが追加されました: "dos2unix"
コマンド ライン エイリアスが追加されました: "doxygen"
コマンド ライン エイリアスが追加されました: "dsymutil"
コマンド ライン エイリアスが追加されました: "elfedit"
コマンド ライン エイリアスが追加されました: "FileCheck"
コマンド ライン エイリアスが追加されました: "find-all-symbols"
コマンド ライン エイリアスが追加されました: "g++"
コマンド ライン エイリアスが追加されました: "gcc"
コマンド ライン エイリアスが追加されました: "gcc-ar"
コマンド ライン エイリアスが追加されました: "gcc-nm"
コマンド ライン エイリアスが追加されました: "gcc-ranlib"
コマンド ライン エイリアスが追加されました: "gcov"
コマンド ライン エイリアスが追加されました: "gcov-dump"
コマンド ライン エイリアスが追加されました: "gcov-tool"
コマンド ライン エイリアスが追加されました: "gdb"
コマンド ライン エイリアスが追加されました: "gdbserver"
コマンド ライン エイリアスが追加されました: "gendef"
コマンド ライン エイリアスが追加されました: "genidl"
コマンド ライン エイリアスが追加されました: "gfortran"
コマンド ライン エイリアスが追加されました: "gprof"
コマンド ライン エイリアスが追加されました: "iconv"
コマンド ライン エイリアスが追加されました: "jwasm"
コマンド ライン エイリアスが追加されました: "ld.bfd"
コマンド ライン エイリアスが追加されました: "ld"
コマンド ライン エイリアスが追加されました: "ld.lld"
コマンド ライン エイリアスが追加されました: "ld64.lld"
コマンド ライン エイリアスが追加されました: "llc"
コマンド ライン エイリアスが追加されました: "lld"
コマンド ライン エイリアスが追加されました: "lldb"
コマンド ライン エイリアスが追加されました: "lldb-argdumper"
コマンド ライン エイリアスが追加されました: "lldb-dap"
コマンド ライン エイリアスが追加されました: "lldb-mi"
コマンド ライン エイリアスが追加されました: "lldb-server"
コマンド ライン エイリアスが追加されました: "lld-link"
コマンド ライン エイリアスが追加されました: "lli"
コマンド ライン エイリアスが追加されました: "lli-child-target"
コマンド ライン エイリアスが追加されました: "llvm-addr2line"
コマンド ライン エイリアスが追加されました: "llvm-ar"
コマンド ライン エイリアスが追加されました: "llvm-as"
コマンド ライン エイリアスが追加されました: "llvm-bcanalyzer"
コマンド ライン エイリアスが追加されました: "llvm-bitcode-strip"
コマンド ライン エイリアスが追加されました: "llvm-cat"
コマンド ライン エイリアスが追加されました: "llvm-cfi-verify"
コマンド ライン エイリアスが追加されました: "llvm-config"
コマンド ライン エイリアスが追加されました: "llvm-cov"
コマンド ライン エイリアスが追加されました: "llvm-cvtres"
コマンド ライン エイリアスが追加されました: "llvm-cxxdump"
コマンド ライン エイリアスが追加されました: "llvm-cxxfilt"
コマンド ライン エイリアスが追加されました: "llvm-cxxmap"
コマンド ライン エイリアスが追加されました: "llvm-debuginfo-analyzer"
コマンド ライン エイリアスが追加されました: "llvm-debuginfod"
コマンド ライン エイリアスが追加されました: "llvm-debuginfod-find"
コマンド ライン エイリアスが追加されました: "llvm-diff"
コマンド ライン エイリアスが追加されました: "llvm-dis"
コマンド ライン エイリアスが追加されました: "llvm-dlltool"
コマンド ライン エイリアスが追加されました: "llvm-dwarfdump"
コマンド ライン エイリアスが追加されました: "llvm-dwarfutil"
コマンド ライン エイリアスが追加されました: "llvm-dwp"
コマンド ライン エイリアスが追加されました: "llvm-exegesis"
コマンド ライン エイリアスが追加されました: "llvm-extract"
コマンド ライン エイリアスが追加されました: "llvm-gsymutil"
コマンド ライン エイリアスが追加されました: "llvm-ifs"
コマンド ライン エイリアスが追加されました: "llvm-install-name-tool"
コマンド ライン エイリアスが追加されました: "llvm-jitlink"
コマンド ライン エイリアスが追加されました: "llvm-jitlink-executor"
コマンド ライン エイリアスが追加されました: "llvm-lib"
コマンド ライン エイリアスが追加されました: "llvm-libtool-darwin"
コマンド ライン エイリアスが追加されました: "llvm-link"
コマンド ライン エイリアスが追加されました: "llvm-lipo"
コマンド ライン エイリアスが追加されました: "llvm-lto"
コマンド ライン エイリアスが追加されました: "llvm-lto2"
コマンド ライン エイリアスが追加されました: "llvm-mc"
コマンド ライン エイリアスが追加されました: "llvm-mca"
コマンド ライン エイリアスが追加されました: "llvm-ml"
コマンド ライン エイリアスが追加されました: "llvm-modextract"
コマンド ライン エイリアスが追加されました: "llvm-mt"
コマンド ライン エイリアスが追加されました: "llvm-nm"
コマンド ライン エイリアスが追加されました: "llvm-objcopy"
コマンド ライン エイリアスが追加されました: "llvm-objdump"
コマンド ライン エイリアスが追加されました: "llvm-opt-report"
コマンド ライン エイリアスが追加されました: "llvm-otool"
コマンド ライン エイリアスが追加されました: "llvm-pdbutil"
コマンド ライン エイリアスが追加されました: "llvm-PerfectShuffle"
コマンド ライン エイリアスが追加されました: "llvm-profdata"
コマンド ライン エイリアスが追加されました: "llvm-profgen"
コマンド ライン エイリアスが追加されました: "llvm-ranlib"
コマンド ライン エイリアスが追加されました: "llvm-rc"
コマンド ライン エイリアスが追加されました: "llvm-readelf"
コマンド ライン エイリアスが追加されました: "llvm-readobj"
コマンド ライン エイリアスが追加されました: "llvm-readtapi"
コマンド ライン エイリアスが追加されました: "llvm-reduce"
コマンド ライン エイリアスが追加されました: "llvm-remarkutil"
コマンド ライン エイリアスが追加されました: "llvm-rtdyld"
コマンド ライン エイリアスが追加されました: "llvm-sim"
コマンド ライン エイリアスが追加されました: "llvm-size"
コマンド ライン エイリアスが追加されました: "llvm-split"
コマンド ライン エイリアスが追加されました: "llvm-stress"
コマンド ライン エイリアスが追加されました: "llvm-strings"
コマンド ライン エイリアスが追加されました: "llvm-strip"
コマンド ライン エイリアスが追加されました: "llvm-symbolizer"
コマンド ライン エイリアスが追加されました: "llvm-tblgen"
コマンド ライン エイリアスが追加されました: "llvm-tli-checker"
コマンド ライン エイリアスが追加されました: "llvm-undname"
コマンド ライン エイリアスが追加されました: "llvm-windres"
コマンド ライン エイリアスが追加されました: "llvm-xray"
コマンド ライン エイリアスが追加されました: "lto-dump"
コマンド ライン エイリアスが追加されました: "mac2unix"
コマンド ライン エイリアスが追加されました: "mingw32-make"
コマンド ライン エイリアスが追加されました: "modularize"
コマンド ライン エイリアスが追加されました: "nasm"
コマンド ライン エイリアスが追加されました: "ndisasm"
コマンド ライン エイリアスが追加されました: "ninja"
コマンド ライン エイリアスが追加されました: "nm"
コマンド ライン エイリアスが追加されました: "not"
コマンド ライン エイリアスが追加されました: "nvptx-arch"
コマンド ライン エイリアスが追加されました: "obj2yaml"
コマンド ライン エイリアスが追加されました: "objcopy"
コマンド ライン エイリアスが追加されました: "objdump"
コマンド ライン エイリアスが追加されました: "opt"
コマンド ライン エイリアスが追加されました: "optscript"
コマンド ライン エイリアスが追加されました: "pexports"
コマンド ライン エイリアスが追加されました: "pp-trace"
コマンド ライン エイリアスが追加されました: "ranlib"
コマンド ライン エイリアスが追加されました: "readelf"
コマンド ライン エイリアスが追加されました: "readtags"
コマンド ライン エイリアスが追加されました: "reduce-chunk-list"
コマンド ライン エイリアスが追加されました: "sancov"
コマンド ライン エイリアスが追加されました: "sanstats"
コマンド ライン エイリアスが追加されました: "size"
コマンド ライン エイリアスが追加されました: "split-file"
コマンド ライン エイリアスが追加されました: "strings"
コマンド ライン エイリアスが追加されました: "strip"
コマンド ライン エイリアスが追加されました: "UnicodeNameMappingGenerator"
コマンド ライン エイリアスが追加されました: "unix2dos"
コマンド ライン エイリアスが追加されました: "unix2mac"
コマンド ライン エイリアスが追加されました: "verify-uselistorder"
コマンド ライン エイリアスが追加されました: "vsyasm"
コマンド ライン エイリアスが追加されました: "wasm-ld"
コマンド ライン エイリアスが追加されました: "widl"
コマンド ライン エイリアスが追加されました: "windmc"
コマンド ライン エイリアスが追加されました: "windres"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-c++"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-g++"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gcc"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gcc-14.2.0"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gcc-ar"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gcc-nm"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gcc-ranlib"
コマンド ライン エイリアスが追加されました: "x86_64-w64-mingw32-gfortran"
コマンド ライン エイリアスが追加されました: "yaml2obj"
コマンド ライン エイリアスが追加されました: "yaml-bench"
コマンド ライン エイリアスが追加されました: "yasm"
コマンド ライン エイリアスが追加されました: "ytasm"
インストールが完了しました
```
</details>

　これで`g++`コマンドなどが使えるようになる。
　もしMake単体が欲しければ、ezwinports:make、GnuWin32:Makeあたりだろうか。ezwinportsの方が最新のVersionではあった。

## FireFox

　`winget search firefox`と実行するとESRとかDeveloper Editionとか色々と引っ掛かるけれど、普通に使用するならIDがMozilla.Firefoxのものでよさそう。

　ブラウザに関して個人的には何となくChromeやEdgeではなくFireFox推しです。FalkonやMinといったニッチなブラウザも使用してみたかったのだけど、Androidでは使えなかったので断念。

```console
PS C:\Users\dorayaki> winget search Mozilla.Firefox -e
名前            ID              バージョン ソース
--------------------------------------------------
Mozilla Firefox Mozilla.Firefox 134.0.1    winget
PS C:\Users\dorayaki> winget install Mozilla.Firefox -e
```

## Windows Terminal

　WindowsのCUIはWindows Terminalの時代みたいですね。下図の通り公式で書かれているようにインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/c8dd6c30-b752-b860-a1bf-70423eb9f747.png)

```console
PS C:\Users\dorayaki>winget install --id Microsoft.WindowsTerminal -e
```

　Windowsターミナルを起動した際に実行されるのがWindows PowerShellになっていたら、PowerShellに変えておこう。

　「Windows Terminalって何やねん、コマンドプロンプトとかPowerShellと何が違うんや」と思って探して読んだのが下記の記事。いまいちシェルとターミナルの違いとか分かっていなかったので助かった。

https://jsnotice.com/posts/2021-05-31/#windows%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A8%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB

## Neovim

　エディタは特に拘りが無ければVisual Studio Codeで良いとは思っている。でもVimってカッコいいよね、という心の声に負けて最近Vimの勉強中。ﾜﾀｼｳﾞｨﾑｾﾞﾝｾﾞﾝﾜｶﾗﾅｲ

```console
PS C:\Users\dorayaki>winget install Neovim.Neovim
```

## Git

　ソフトウェア開発をするならGitは必要じゃろう。

```console
PS C:\Users\dorayaki>winget install --id Git.Git -e --source winget
```

## Mery

　最近、ただのテキストやMarkdownを書く時に使っている。その内、小説でも書こうかな。

```console
PS C:\Users\dorayaki>winget install --id Kuro.Mery.Beta
```