しばたテックブログ

気分で書いている技術ブログです。

Windows 7にPowerShell 6.0をインストールする

【2017/12/27追記】

最新のPowerShell 6.0 RC2での手順を別エントリに記載しました。

blog.shibata.tech

インストール手順はこちらのエントリをご覧ください。


割と誰得なエントリです。

PowerShell 6.0のサポートしているプラットフォームにWindows 7があったので実際に試したところ意外とハマったので記録を残しておきます。

インストール方法について

github.com

Windows 7向けのPowerShell 6.0(現時点ではAlpha 17)はMSIのインストーラーが提供されています。

公式のインストール手順にはMSIを実行するだけ、Windows 8.1、Windows 2012R2ではVisual Studio 2015 の Visual C++ 再頒布可能パッケージも必要だと記載されているだけであり、Windows 7向けには特に注意書きなどは記載されていません...

一抹の不安を感じますがこの手順を信じて進めてみることにします。

Windows 7にPowerShell 6.0をインストールする

今回は32Bit版での手順を紹介します。
64Bit版もやることは同じです。

1. とりあえずMSIをインストールすると...

インストール媒体からOSをインストールした直後の状態でMSIを実行しPowerShell 6.0をインストールすると、インストール自体はできるのですがプログラムを実行すると以下のエラーが出てしまいます。

コンピューターに api-ms-win-crt-runtime-l1-1-0.dll がないため プログラムを開始できません。 この問題を解決するには、プログラムを再インストールしてみてください。

f:id:stknohg:20170401081756p:plain

詳細ついては特に説明不要かと思います。
Windows 7でもWindows 8.1、Windows 2012R2同様にVisual Studio 2015 の Visual C++ 再頒布可能パッケージが必要となります。

2. SP1のインストール

Visual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールするには、Windows 7 SP1である必要があります。

このためSP1が適用されていない環境では先にSP1にする必要があります。
この手順については細かく説明しませんが、Windows UpdateかKB976932を適用してください。

3. Visual Studio 2015 の Visual C++ 再頒布可能パッケージのインストール

SP1を適用したらVisual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールしてください。
インストーラーの指示に従うだけですのでこの手順についても細かく説明はしません。

4. KB2533623 の適用

Visual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールした後でPowerShell 6.0を実行すると、今度は以下のエラーが出てしまいました。

Failed to load the dll from [C:\Program Files\PowerShell\6.0.0.17\hostfxr.dll],
HRESULT: 0x80070057 The library hostfxr.dll was found, but loading it from C:\Program Files\PowerShell\6.0.0.17\hostfxr.dll failed

f:id:stknohg:20170401081920p:plain

エラーメッセージを見るに.NET Coreの起動に必要な何かが不足していることがわかります。

そこで.NET Coreの利用に必要な事前条件を確認すると、

For Windows 7 and Windows Server 2008 machines only:
Make sure that your Windows installation is up-to-date and includes hotfix KB2533623 installed through Windows Update.

と記載されており、KB2533623を適用する必要があることがわかります。

この更新を適用することで無事PowerShell 6.0を起動することができました。

f:id:stknohg:20170401081934p:plain

おまけ

Visual Studio Code PowerShell拡張はPowerShell 3.0以上であれば使えます。

f:id:stknohg:20170401082714p:plain

settings.jsonpowershell.developer.powerShellExePathにPowerShell 6.0のパスを設定することでWindows 7でもPowerShell拡張を使うことが可能です。

// settings.json
{
    "powershell.developer.powerShellExePath": "C:\\Program Files\\PowerShell\\6.0.0.17\\powershell.exe"
}

f:id:stknohg:20170401082547p:plain

右下のPowerShellのバージョン欄がちゃんと6.0になっていることがわかります。

最後に

とりあえずこんな感じです。

現時点でWindows 7を扱う環境であれば、大抵の場合SP1および最新の(またはそれに近い)Windows Updateが適用されていると思いますので、本エントリの様にハマることは少ないと思います。

また、Windows 7ではWMF 5.1(PowerShell 5.1)もインストールすることができますので通常はこちらをインストールすることになるでしょう。

stknohg.hatenablog.jp

もともと本エントリを書こうと思った動機は「何らかの理由でPowerShell 3.0以降をインストールすることができない環境にPowerShell 6.0をサクッとインストールして代替とすることができないか?」だったのですが、現実はそう甘くなかったです。

Visual Studio Code PowerShell拡張で使えるコマンドまとめ

前回前々回に続いて今回はPowerShell拡張で利用可能なコマンドをまとめました。

各コマンドがどのバージョンから利用可能になったか調査するのが難しい部分があったため、単純に現在最新のバージョン(Ver.0.11)で利用可能なものをリストアップする形としています。

1. コマンドパレットで使えるコマンド

最初にコマンドパレットで利用可能なコマンドについて記載します。

コマンドパレットはCtrl+Shift+Pで開くことができ、Powershell:で始まるコマンドがPowerShell拡張で使えるコマンドになります。

f:id:stknohg:20170328210828p:plain

以下に一覧を記載します。

コマンド 内容
PowerShell: Create New Project from Plaster Template Plasterを使いテンプレートからプロジェクトを生成します。
PowerShell: Expand Alias (Shift+Alt+E) スクリプト中のエイリアスを展開します。
PowerShell: Find/Install PowerShell Modules from the gallery (Ctrl+K Ctrl+F) PowerShell Galleryからモジュールを検索しインストールします。
PowerShell: Get online help for Commands (Ctrl+F1) 選択されたコマンドのオンラインヘルプを表示します。
PowerShell: Open current file in PowerShell ISE (Ctrl+Shift+I) 現在のファイルをPowerShell ISEで開きます。
PowerShell: Open Examples Folder Examplesフォルダを開きます。
PowerShell: Open PowerShell Extension logs Folder PowerShell拡張のログフォルダを開きます。
PowerShell: Restart Current Session 現在のPowerShell Sessionを再起動します。
PowerShell: Run selecton (F8) 選択部分を実行します。
PowerShell: Select PSScriptAnalyzer Rules PSScriptAnalyzerで適用するルールを設定します。
PowerShell: Show additional commands from PowerShell modules PowerShell拡張に追加したコマンドを表示します。
PowerShell: Show Integrated Console Integrated Consoleを表示します。
PowerShell: Open PowerShell Extension logs PowerShell拡張のログを出力に表示します。
PowerShell: Open Show Session Menu セッションメニューを表示します。

PowerShell: Create New Project from Plaster Template

Plasterを使いテンプレートからプロジェクトを生成します。
Plasterでは独自のテンプレートを作ることができますが、現時点ではNew PowerShell Manifest Moduleというマニフェストモジュールを作るテンプレートのみ登録されています。

f:id:stknohg:20170328020411p:plain

動作を確認してみたところ、Integrated Consoleとの相性が悪いのか、このコマンドを実行してもキャレットの制御が上手くいかずモジュールの生成がかなり面倒なことになっていました…
これはそのうち改善されると思います。

PowerShell: Expand Alias

スクリプト中のエイリアスを展開し元の関数に戻してくれます。
例えば、

echo "Hello World"

というスクリプトであれば、

Write-Output "Hello World"

と変換してくれます。
非常に便利な機能な上Shift+Alt+Eのショートカットキーも割り当てられていますので覚えておくとスクリプトの作成が捗るでしょう。

PowerShell: Find/Install PowerShell Modules from the gallery

PowerShell Galleryからモジュールを検索しインストールすることができます。

f:id:stknohg:20170328022653p:plain

Install-Module -Name [モジュール名] -Scope CurrnetUser

と同等の機能ですが、一旦すべてのモジュール情報をローカルにキャッシュしている様で初回実行時はレスポンスが非常に悪いです…
率直に言ってこれならIntegrated Consoleから直接Find-ModuleInstall-Moduleを実行した方がマシだと思います。

PowerShell: Get online help for Commands

選択されたコマンドのオンラインヘルプ(MSDN)を表示します。
残念ながらブラウザを起動して該当のページを開いてくれるだけで、PowerShell ISEのコマンドアドオンの様に至れり尽くせりな感じではないです…

PowerShell: Open current file in PowerShell ISE

現在のファイルをPowerShell ISEで開きます。
機能としては面白いですが、正直使いどころがわかりません…

PowerShell: Open Examples Folder

新しいVisual Studio Codeを起動し、Examplesフォルダを開きます。

f:id:stknohg:20170328022410p:plain

PowerShell: Open PowerShell Extension logs Folder

新しいVisual Studio Codeを起動し、PowerShell拡張のログフォルダを開きます。

f:id:stknohg:20170328023020p:plain

PowerShell: Restart Current Session

現在のPowerShellセッションを再起動します。
このコマンドは実質PowerShell拡張の再起動コマンドとなります。

前回触れたとおり、powershell.startAutomatically=falseの場合はこのコマンドを使ってPowerShell拡張を有効にする必要があります。

PowerShell: Run selecton

ファイル中で選択された部分を実行します。

このコマンドはコマンドパレットからよりF8キーを押して実行する方が多いかと思います。

PowerShell: Select PSScriptAnalyzer Rules

PSScriptAnalyzerで適用するルールを設定します。

f:id:stknohg:20170328023728p:plain

チェックを付けたルールが有効になりconfirmをクリックすると反映されます。

この設定は永続化しませんので、永続化させたい場合はpowershell.scriptAnalysis.settingsPathパラメーターに独自の設定ファイルを記述する必要があります。

PowerShell: Show additional commands from PowerShell modules

PowerShell拡張に追加したコマンドを表示・実行します。

ここでコマンドを表示するには、あらかじめRegister-EditorCommandを使いコマンドを追加しておく必要があります。
細かい手順については Extending the Host Editor を参考にしてください。*1

PowerShell: Show Integrated Console

Integrated Consoleを表示します。
おおむねCtrl+@と同等の動作をしますが、細かい違いとしてはIntegrated Terminalに複数の端末がある場合にIntegrated Consoleを選択して表示してくれます。
(Ctrl+@の場合は直近に開かれていた端末を表示するだけです)

PowerShell: Open PowerShell Extension logs

PowerShell拡張のログを出力に表示します。

f:id:stknohg:20170328024640p:plain

PowerShell: Open Show Session Menu

セッションメニューを表示します。

f:id:stknohg:20170328024754p:plain

セッションメニューでは、

  • Restart Current Session
  • Open Session Logs Folder

コマンドと、このメニューにのみ存在する

  • Switch to Windows PowerShell [(x86)|(x64)]

コマンドが提供されています。
Switch to Windows PowerShellコマンドは意外と使いどころがありそうなので独立したコマンドにしてほしい感じです。


【2017/07/13追記】

Ver.1.2.0よりこのメニューが拡張され、Switch to Windows PowerShell [(x86)|(x64)]に加え、追加でインストールされたPowerShell*2に切り替えることが出来る様になりました。

f:id:stknohg:20170713190247p:plain

2. Integrated Consoleで使えるコマンド

  • 2017/07/13 Ver.1.4.0で追加されたコマンドに対する説明を追記

続けてIntegrated Consoleで使える独自コマンド*3について説明します。

現時点ではまだpseditの1コマンドしかありません。

コマンド 内容
psedit 指定したファイルをVisual Studio Codeで表示します。
Out-CurrentFile フォーマットされた文字列を現在開いているファイルに出力します。
New-VSCodeHtmlContentView 新しいHTMLコンテンツビューを作成します。
Set-VSCodeHtmlContentView 指定されたHTMLコンテンツビューにHTMLを上書きします。
Write-VSCodeHtmlContentView 指定されたHTMLコンテンツビューにHTMLを追記します。
Show-VSCodeHtmlContentView 指定されたHTMLコンテンツビューをアクティブにして表示します。
Close-VSCodeHtmlContentView 指定されたHTMLコンテンツビューを非表示にします。

psedit

pseditは指定したファイルをVisual Studio Codeで開くコマンドです。
PowerShell ISEに同名のコマンドが存在しますが、Ver.0.11になってPowerShell拡張にも実装されました。

PowerShell ISEとはパラメーター名が異なり-FilePathsとなっています。*4

実行例は以下の様な感じです。

> psedit -FilePaths .\hello.ps1, .\world.ps1

f:id:stknohg:20170328214905p:plain

Out-CurrentFile (Ver.1.4.0より利用可)

コマンドなどを実行した結果の文字列を現在開いているファイルに文字列として出力します。
下の画像を見ていただければイメージは一発で掴めるかと思います。

実行例)

ls c:\ -Directory | select -ExpandProperty name | Out-CurrentFile

f:id:stknohg:20170713212416p:plain

New-VSCodeHtmlContentView (Ver.1.4.0より利用可)

Ver.1.4.0より、HTMLコンテンツビュー(チェンジログなどの表示に使われているHTML形式のビュー)を扱うためのコマンドレットが追加されました。

現状これらのコマンドが何に使えるのかといえば答えに窮するのですが、PowerShell TeamとしてもUI拡張のための機能をとりあえず作ってみたといった感じの様です。
そんな感じなのでこのHTMLコンテンツビューに関する機能については今後いろいろと変化するものと予想されます。

で、このNew-VSCodeHtmlContentViewでは新しいHTMLコンテンツビューを作成します。
次に説明するSet-VSCodeHtmlContentViewWrite-VSCodeHtmlContentViewと合わせて、GitHubに記載されている例を見ればイメージは掴めるかと思います。

実行例)

$view = New-VSCodeHtmlContentView -Title "My Custom View" -ShowInColumn One
Set-VSCodeHtmlContentView -View $view -Content "<h1>Hello world!</h1>"
Write-VSCodeHtmlContentView $view -Content "<b>I'm adding new content!</b><br />"

https://user-images.githubusercontent.com/79405/27394133-f96c38cc-565f-11e7-8102-a3727014ea5a.GIF

(上図は https://github.com/PowerShell/vscode-powershell/releases より)

ちなみに、現時点でHTMLコンテンツビューにJavaScriptを差し込むことはできません。

Set-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューにHTMLを上書きします。
実行例は上記参照。

Write-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューにHTMLを追記します。
実行例は上記参照。

Show-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューをアクティブにして表示します。

実行例)

Show-VSCodeHtmlContentView -View $view

Close-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューを非表示にします。

実行例)

Close-VSCodeHtmlContentView -View $view

最後に

とりあえずこんな感じです。

率直に言ってあまりぱっとしないコマンドもありますが、便利なコマンドもありますので覚えておいて損はないかと思います。

*1:こちらについては時間をとって別記事を書こうと思います。

*2:基本的にはPowerShell 6.0の各バージョンになるはずですが…

*3:というか関数ですね…

*4:PowerShell ISEのpseditのパラメーター名は-filenamesです。

Visual Studio Code PowerShell拡張の設定まとめ

前回のエントリでコードフォーマットに関する設定をまとめましたが、折角なのでほかの設定もまとめてみました。

stknohg.hatenablog.jp

今回説明する設定はすべてsettings.jsonの項目になります。

1. 拡張機能に関する設定

最初に拡張機能そのものに関する設定について記載します。

powershell.startAutomatically (Ver.0.11より)

PowerShellのスクリプトファイルを開いた際にPowerShell拡張を自動的に開始するか否かを設定します。
デフォルトtrueです。

この設定をfalseにした場合、

> PowerShell: Restart Current Session

コマンドを明示的に実行しないと拡張が有効になりません。

このオプションはマシンスペックの低い環境や、拡張の起動よりもファイルの内容を参照することを優先させたい場合に使う事を想定しているそうです。

powershell.useX86Host (Ver.0.5より)

64bit OSの環境で32bit版の拡張機能を利用するか否かを設定します。
デフォルトfalseです。

32bit OSの環境でこのパラメーターを設定しても何も起きません。

powershell.enableProfileLoading (Ver.0.6より)

Powershell拡張の起動時にプロファイル(profile.ps1Microsoft.VSCode_profile.ps1)をロードするか否かを設定します。
Ver.0.6.1からデフォルト値がtrueになっています。(Issue #180)

プロファイルについての詳細は、

stknohg.hatenablog.jp

のエントリを参考にしてください。

なお、デバッガはこの設定の影響を受けません。

powershell.developer.powerShellExePath (Ver.0.7.1より)

デフォルトでないPowerShellを使う場合にその実行ファイルのパスを指定します。
デフォルト値は""(デフォルトのPowerShellを使う)です。

このパラメーターはVer.1.4.0よりpowershell.powerShellExePathに移行され、非推奨となりました。

powershell.powerShellExePath (Ver.1.4.0より)

デフォルトでないPowerShellを使う場合にその実行ファイルのパスを指定します。
デフォルト値は""(デフォルトのPowerShellを使う)です。

powershell.developer.editorServicesLogLevel (Ver.0.4より)

PowerShell Editor Servicesのログレベルを設定します。
設定可能な値はVerboseNormalWarningErrorで、デフォルト値はNormalです。

この設定はPowerShell拡張でエラーが出た場合の調査用ですので、通常この内容を変える必要はありません。

ちなみにログフォルダは、

> PowerShell: Open PowerShell Extension Logs Folder

コマンドで開くことができます。

2. Integrated Terminal(Integrated Console)に関する設定

PowerShell拡張Ver.0.10より統合ターミナル(Integrated Terminal)にPowershell拡張独自のコンソール(Integrated Console)が使える様になりました。
ここではIntegrated Consoleに関わる設定について記載します。

powershell.integratedConsole.showOnStartup (Ver.0.11より)

PowerShell拡張の起動時にIntegrated Consoleを起動するか否かを設定します。
デフォルトtrueです。

powershell.integratedConsole.focusConsoleOnExecute (Ver.0.11より)

スクリプト実行時にIntegrated Consoleにフォーカスを移すか否かを設定します。
デフォルトtrueです。

3. コード支援に関する設定

PowerShell Script Analyzer等のコード支援機能にかかわる設定について記載します。

powershell.scriptAnalysis.enable (Ver.0.2より)

PowerShell Script Analyzerによるリアルタイムコード分析を有効にするか否かを設定します。
デフォルトtrueです。

powershell.scriptAnalysis.settingsPath (Ver.0.6より)

ユーザー独自のPowerShell Script Analyzer設定ファイルを指定します。
デフォルト""です。

この設定により既定の動作を上書きできる様になります。
設定例についてはこちらをご覧ください。

4. その他の設定

最後にその他の、おもに中の人向けの設定について記載します。

ここで説明する内容ついては自信の無い部分もありますので、もし間違いがあればご指摘いただけると助かります。

powershell.developer.editorServicesWaitForDebugger (Ver.0.2より)

この設定をtrueにするとPowerShell Editor Serviceを/waitForDebuggerパラメーター付きで起動します。
細かいところはよくわからないのですが、ざっとソースを調べた限りではこのパラメーターが指定されるとPowerShell Editor Serviceの起動時にデバッガからアタッチされるのを待ち続ける様です。

おそらく中の人向けの機能だと思われます。

powershell.developer.bundledModulesPath (Ver.0.7.1より)

リリースノートに明記されていないのですが、コミットログを追う限りVer.0.7.1から導入されている様です。

もともとはPowerShell拡張で使われるモジュール(PowerShell Editor ServicesPowerShell Script AnalyzerPlasterなど)のパスを設定するものだったのですが、Ver.0.10から中の人向けの機能になった様です。

デフォルト値は"../modules/"から""に変更されています。

powershell.developer.featureFlags (Ver.0.11より)

PowerShell拡張で実験的な機能を有効にするためのフラグを設定するそうです。
デフォルト値は空の配列です。

ただ、現時点でここに設定可能なフラグはない様で今後のリリースで増えていくものと思われます。
この設定はStart-EditorServices.ps1-FeatureFlagsパラメーターとしてPowerShell Editor Serviceに渡されるのですが、ソースを見ればわかりますが、現時点ではスクリプト内で全く使われていません。

powershell.developer.powerShellExeIsWindowsDevBuild (Ver.0.9より)

実行しているPowerShellが開発者向けビルドであることを明示するための設定です。
デフォルトfalseです。

完全に中の人向けの設定で、この設定により何が起こるのかは全くわかりません。

最後に

ざっとですがPowerShell拡張の設定をまとめてみました。
フォーマットに関する設定同様このエントリの内容は随時更新していきたいと思います。