Windows 10にPowerShell 6をインストールしてみた

Windows 10にPowerShell 6をインストールしてみました。気づいたことをメモしておきます。

# インストール方法

PowerShellではなくPowerShell Coreをインストールする。

> PowerShell 6 以降を使う場合は、Windows PowerShell ではなく PowerShell Core をインストールする必要があります。  詳細については、「[Windows への PowerShell Core のインストール](https://docs.microsoft.com/ja-jp/powershell/scripting/setup/installing-powershell-core-on-windows?view=powershell-6)」を参照してください。<br/>[Windows PowerShell のインストール | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/setup/installing-windows-powershell?view=powershell-6) 

PowerShell CoreはMSのGitHubページで配布されている。

> PowerShell を Windows クライアントまたは Windows Server にインストールするには (Windows 7 SP1、Server 2008 R2 以降で機能)、MSI パッケージを弊社の GitHub [リリース](https://github.com/PowerShell/PowerShell/releases) ページからダウンロードします。<br/>[Windows への PowerShell Core のインストールInstalling PowerShell Core on Windows | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/setup/installing-powershell-core-on-windows?view=powershell-6)

ここでは、[リリース](https://github.com/PowerShell/PowerShell/releases) ページにある最新プレビュー版ではなく、[README](https://github.com/PowerShell/PowerShell/blob/master/README.md)にまとめられているリンクから、Windows (x64)用の安定版（Downloads (stable)）のmsiファイルだった`PowerShell-6.0.2-win-x64.msi`を取得し、インストールした。

インストーラーに従って進めていくだけだったけど、手順説明とか欲しいようであれば「[Windows 7にPowerShell 6.0をインストールする - 再び - しばたテックブログ](http://blog.shibata.tech/entry/2017/12/27/204933)」が参考になりそう。

# スタートメニュー

Windowsのスタートメニュー内で、「PowerShell」フォルダ内に「PowerShell 6.0.2」だけが作成されていた。PowerShell 5.xまでは「Windows PowerShell」フォルダ内に「Windows PowerShell」「Windows PowerShell ISE」が作成されていた。

# バージョン

`$PSVersionTable`の出力内容に一部差異があった。

|Name|PS Core 6.0.2|PS Desktop 5.1.15063.909|
|----|----|----|
|PSVersion|6.0.2|5.1.15063.909|
|PSEdition|Core|Desktop|
|BuildVersion||10.0.15063.909|
|CLRVersion||4.0.30319.42000|
|GitCommitId|v6.0.2||
|OS|Microsoft Windows 10.0.15063||
|Platform|Win32NT||
|PSCompatibleVersions|{1.0, 2.0, 3.0, 4.0...}|{1.0, 2.0, 3.0, 4.0...}|
|PSRemotingProtocolVersion|2.3|2.3|
|SerializationVersion|1.1.0.1|1.1.0.1|
|WSManStackVersion|3.0|3.0|

[エンジンの更新 | PowerShell Core 6.0 の新機能What's New in PowerShell Core 6.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-core-60?view=powershell-6#engine-updates)に説明されていた。

# モジュールの自動読み込みパス

`$env:PSModulePath`は以下になっていた。

    $env:PSModulePath -split ";" | sort
    c:\program files\powershell\6.0.2\Modules
    C:\Program Files\PowerShell\Modules
    C:\Users\tsukamoto\Documents\PowerShell\Modules

PowerShell 5.0.1環境の方は以下になっていた。

    $env:PSModulePath -split ";" | sort
    C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ResourceManager\AzureResourceManager\
    C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\
    C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Storage\
    C:\Program Files\WindowsPowerShell\Modules
    C:\Program Files\WindowsPowerShell\Modules\
    C:\Users\tsukamoto\Documents\WindowsPowerShell\Modules
    C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

`C:\Program Files\`以下についても`C:\Users\tsukamoto\Documents\`以下についても、`WindowsPowerShell\Modules`ではなく`PowerShell\Modules`になっていて、共通するパスはない。このため、PowerShell 5.0.1環境でインストールまたは配置したモジュールは、PowerShell 6.0.2では自動読込されなかったし、`Import-Module`でも見つけられなかった。

[Windows PowerShell との後方互換性 | PowerShell Core 6.0 の新機能What's New in PowerShell Core 6.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-core-60?view=powershell-6#backwards-compatibility-with-windows-powershell)に説明されていた。これまでのものは「WIndows PowerShellモジュール」という扱いになり、以下を実行することでパスを追加できる様子（まだ実施してない）。

    Install-Module WindowsPSModulePath -Force
    Add-WindowsPSModulePath

# ConvertTo-Jsonのインデントが変わった

`ConvertTo-Json`のインデントが固定幅になっていて、見やすかった。

    PS C:\Program Files\PowerShell\6.0.2> $PSVersionTable | ConvertTo-Json
    {
      "Platform": "Win32NT",
      "WSManStackVersion": {
        "Major": 3,
        "Minor": 0,
        "Build": -1,
        "Revision": -1,
        "MajorRevision": -1,
        "MinorRevision": -1
      },
    (以下略)

PowerShell 5までは可変幅で、インデントが深くなると泣きそうだった。

    $PSVersionTable | ConvertTo-Json
    {
        "PSVersion":  {
                          "Major":  5,
                          "Minor":  1,
                          "Build":  15063,
                          "Revision":  909,
                          "MajorRevision":  0,
                          "MinorRevision":  909
                      },
        "PSEdition":  "Desktop",
    (以下略)

[コマンドレットの更新 | PowerShell Core 6.0 の新機能What's New in PowerShell Core 6.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-core-60?view=powershell-6#cmdlet-updates)の「JSONコマンドレット」に説明されていた。

# NuGetやPowerShellGetはすぐに使える

`Get-PackageProvider`を実行すると`Nuget`や`PowerShellGet`が表示された。モジュールインストールのためにまずこれらの環境を作る、ということは必要なさそう。`ProviderPath`を見る限り、たぶんPowerShell Coreに同梱されている。

    Get-PackageProvider | Select Name, Version, ProviderPath
    
    Name          Version   ProviderPath
    ----          -------   ------------
    NuGet         2.8.5.210 C:\program files\powershell\6.0.2\Modules\PackageManagement\1.1.7...
    PowerShellGet 1.6.0.0   C:\program files\powershell\6.0.2\Modules\PowerShellGet\1.6.0\PSM...

# プロキシ経由でのモジュールインストール

`Find-Module`や`Install-Module`等の実行時、プロキシ経由でモジュールインストールする時には`-Proxy`、プロキシが認証を必要とする場合は合わせて`-ProxyCredential`パラメータを指定する。以下にまとめた。

* [PowerShell 6.0でPowerCLI 10.1を起動できない - Qiita](https://qiita.com/tsukamoto/items/5f148f758ac060092260)

# COMオブジェクトの使用

Windows PowerShellではなくマルチOSのPowerShell CoreでCOMオブジェクトって使えるのかなと思った。とりあえずWindows上であれば、以下でExcelを起動し、可視状態にすることができた。

    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $true

----

本ページ内容は筆者が参照の便のためにある時点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。