tech.guitarrapc.cóm

Technical updates

PowerShell 5.0 と Windows10 と RTM のリリースについて

Windows Management Framework 5.0 (WMF5.0) のロードマップがPowerShell Teamから公開されました。

https://blogs.msdn.com/b/powershell/archive/2015/08/06/windows-management-framework-wmf-5-0-roadmap.aspx

一方でWindows 10にはすでにWMF5.0が載っています。では、その違いは何なのかについて軽く触れておきます。

9/4 追記

ぎりぎり8/31にWMF5.0 Production Previewがでました。

https://blogs.msdn.com/b/powershell/archive/2015/08/31/windows-management-framework-5-0-production-preview-is-now-available.aspx

Windows 10ビルド10240にあったDSC周りのバグも修正されています。

利用可能OSは次の通りです。.NET 4.5以上をいれれば動くのでぜひどうぞ!

  • Windows Server 2012 R2
  • Windows Server 2012
  • Windows 2008 R2 SP1
  • Windows 8.1
  • Windows 7 SP1

12/20 追記

WMF5 RTMがリリースされました。最新情報はこちらをどうぞ。

https://tech.guitarrapc.com/entry/2015/12/19/083842

Windows 10 には WMF5.0 が搭載されている

気づいた方も多いように、Windows 10にはWMF 5.0が搭載されており、当然PowerShell 5.0が利用できます。

$PSVersionTable

バージョンは、5.0.10240.16384と「Windows 10のビルドバージョン」10240が見て取れます。

Name                           Value
----                           -----
PSVersion                      5.0.10240.16384
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   10.0.10240.16384
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3

WMF5.0 April Preview と Windows 10 の違い

さて、このWindows 10のPowerShell 5.0はWMF5.0 April Previewと違う点がいくつかあります。目につくところだけ触れておきます。

PSReadline の搭載

PSRealLineがPowerShell Coreに取り込まれたことによる機能追加がまず気づくところです。

https://github.com/lzybkr/PSReadLine

PSReadlineによる目に見える変化は2点あります。ほかにも強化点があるのですが、まぁいいです。

  • PowerShellコンソールでのシンタックスハイラックス
  • PowerShellコンソールでのインテリセンス表示

実際にモジュールを見てみると、

Get-Module

この通りですね。

ModuleType Version Name                            ExportedCommands
---------- ------- ----                            ----------------
Manifest   3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   3.1.0.0 Microsoft.PowerShell.Utility    {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     1.1     PSReadline                      {Get-PSReadlineKeyHandler, Get-PSReadlineOption, Remove-PSReadlin...

Windows 8.1にWMF5.0を当ててもPSRealtineが有効にならないことに気づいた人はWindows 10にあげられると幸せになれるでしょう。

ConsoleHost.exe の更新

ほかにも、Windows 10でConsoleHost.exeが更新されてCtrl + vによる貼り付けができるようになりました。 cmd.exeだけじゃないのです。

cmd.exeもPowerShell.exeも両方ConsoleHost.exeの上で動いているので改善を享受できるのです。やったね!

Windows 10 は RTM?

WMF 5.0のRTMが2015年Q4なのにWindows 10にはWMF5.0が載ってるのはどういうことなのかというのが先のロードマップに載っています。

https://blogs.msdn.com/b/powershell/archive/2015/08/06/windows-management-framework-wmf-5-0-roadmap.aspx

Production Preview (PP) が、2015年8月を目標に公開されるようです。そして、RTMが2015年Q4を目標に公開されるとあります。

Production Previewはあまり聞きなれない言葉ですが、これまでのPreviewとは以下の違いがあるとしています。

WMF 5.0 Production Preview will differ from previous previews of WMF 5.0 in the following ways:

  • WMF 5.0 RTMリリース後も3カ月間フルサポートされます。「フルサポート」とは、本番環境を妨げる原因を調査し、必要に応じてワークアラウンドを提供するという意味としています
  • PPの機能はすべてProduction Ready。つまり本番で利用可能としています。Experimentalな実装は含まないとあります
  • PPインストール前に、これまでのWMFプレビューリリースはアンインストールが必要としています。(Windows 10はそのままあげていいようですが)

そして、Windows 10の搭載しているWMF 5.0はPPともRTMと表現されていません。その違いは何なのでしょうか。

Windows 10 の WMF5.0

Windows 10のPowerShell 5.0.10240.16384は、Windows 10に搭載された他Windowsコンポーネントと同様にサポートされるとあります。

そしてRTMでのPowerShellと同じコードベースであり、RTMではフィードバックによるズレとバグ修正などを含む予定のようです。

つまり、本番で利用してもいい製品レベルだが、RTMではよりバグも少なくなるようですね。

実際、Windows 10ではDSC周りでバグが残っており、ヘルプ周りもヘルプが表示されていないものが数多くあります。

help Get-Module

ぴゃっ、説明全くないです。

NAME
    Get-Module

SYNTAX
    Get-Module [[-Name] <string[]>] [-FullyQualifiedName <ModuleSpecification[]>] [-All]  [<CommonParameters>]

    Get-Module [[-Name] <string[]>] -CimSession <CimSession> [-FullyQualifiedName <ModuleSpecification[]>] [-ListAvaila
    ble] [-Refresh] [-CimResourceUri <uri>] [-CimNamespace <string>]  [<CommonParameters>]

    Get-Module [[-Name] <string[]>] -ListAvailable [-FullyQualifiedName <ModuleSpecification[]>] [-All] [-Refresh]  [<C
    ommonParameters>]

    Get-Module [[-Name] <string[]>] -PSSession <PSSession> [-FullyQualifiedName <ModuleSpecification[]>] [-ListAvailabl
    e] [-Refresh]  [<CommonParameters>]


ALIASES
    gmo


REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
        -- To download and install Help files for the module that includes this cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help Get-Module -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=141552.

ロードマップから予想できること

ロードマップ詳細待ちですが、RTMが2015年Q4ということは、Windows Server 2016のリリースに向けてのリリースを考えてるんでしょうかねぇ。

過去には、2014年10月にWMF 4.0のRolling Update 1更新をWindows Updateから配信しています。

Windows 10もRTMまでは、Production PreviewをWindows Updateで配信するといいですね。

まとめ

Windows 10は進化するOSです。PowerShell 5.0も進化に遅れないように改善していくようなので、どしどしフィードバックしましょう。

https://connect.microsoft.com/PowerShell/Feedback

PowerShell ISE のオプションをPowerShell から操作しよう

言いたいことは1つだけです。fontはお願いだからConsolasにしてくれ。

ということで簡単なネタを。

すべては $psISE.Option に

いいから黙ってこれをどうぞ

https://gist.github.com/guitarrapc/a191a4aa358249560029

これが

こうなります。

最高でしょ。

変更可能な内容

$psISE.Options

たくさんありますよ。


SelectedScriptPaneState                   : Right
ShowDefaultSnippets                       : True
ShowToolBar                               : True
ShowOutlining                             : True
ShowLineNumbers                           : True
TokenColors                               : {[Attribute, #FF00BFFF], [Command, #FF0000FF], [CommandArgument, #FF8A2BE2], [CommandPara
                                            meter, #FF000080]...}
ConsoleTokenColors                        : {[Attribute, #FFB0C4DE], [Command, #FFE0FFFF], [CommandArgument, #FFEE82EE], [CommandPara
                                            meter, #FFFFE4B5]...}
XmlTokenColors                            : {[Comment, #FF006400], [CommentDelimiter, #FF008000], [ElementName, #FF8B0000], [MarkupEx
                                            tension, #FFFF8C00]...}
DefaultOptions                            : Microsoft.PowerShell.Host.ISE.ISEOptions
FontSize                                  : 9
Zoom                                      : 125
FontName                                  : Consolas
ErrorForegroundColor                      : #FFFF0000
ErrorBackgroundColor                      : #00FFFFFF
WarningForegroundColor                    : #FFFF8C00
WarningBackgroundColor                    : #00FFFFFF
VerboseForegroundColor                    : #FF00FFFF
VerboseBackgroundColor                    : #00FFFFFF
DebugForegroundColor                      : #FF00FFFF
DebugBackgroundColor                      : #00FFFFFF
ConsolePaneBackgroundColor                : #FF012456
ConsolePaneTextBackgroundColor            : #FF012456
ConsolePaneForegroundColor                : #FFF5F5F5
ScriptPaneBackgroundColor                 : #FFFFFFFF
ScriptPaneForegroundColor                 : #FF000000
ShowWarningForDuplicateFiles              : True
ShowWarningBeforeSavingOnRun              : True
UseLocalHelp                              : True
AutoSaveMinuteInterval                    : 2
MruCount                                  : 10
ShowIntellisenseInConsolePane             : True
ShowIntellisenseInScriptPane              : True
UseEnterToSelectInConsolePaneIntellisense : True
UseEnterToSelectInScriptPaneIntellisense  : True
IntellisenseTimeoutInSeconds              : 3

もどしたくなったら、$psISE.Options.DefaultOptionsでもご覧ください。

まとめ

黙ってfontはConsolasにしてください。本気で。

PowerShell 5.0 で搭載された using namespace シンタックスの概要

PowerShellから .NETクラスを呼び出して操作するときの最大の苦行。それが、クラスの名前空間を毎回毎回書かないといけないことです。

たとえば、List(T) を扱うとこうなります。無駄に使ってみましょう。

https://gist.github.com/guitarrapc/1149232432474369647c

ジェネリクスの扱いつらぽよ。

Item : 0
Item : 1
Item : 2
Item : 3
Item : 4
Item : 5
Item : 6
Item : 7
Item : 8
Item : 9

C# ならusing <NameSpace>が用意されているのでいいのですが、PowerShellでは名前空間を省略する方法がなくつらかったわけです。

これがPowerShell 5.0で変わります。

言語仕様上の using シンタックス

実は言語仕様上の予約語にはusingがずっとあったのです。

言語仕様でも

https://www.microsoft.com/en-us/download/details.aspx?id=36389

予約語ヘルプにもあります。

https://technet.microsoft.com/en-us/library/hh847868.aspx

将来のためってことで。

The keywords class, define, from, using, and var are reserved for future use.

そもそも言語仕様が3.0までしか公開されてないのがもにょん

蛇足

ちなみに、過去にはPoweShell Teamブログでこんな感じでIDisposable用のusingによるtry{}finally{}が紹介されたことも

https://blogs.msdn.com/b/powershell/archive/2009/03/12/reserving-keywords.aspx

まぁこれ、v2はともかくv5.0では使えないんですけどね!

https://gist.github.com/guitarrapc/0ebd8c1c54aabc7e610c

PoweShell 5.0 で搭載される using シンタックス

usingときくと、C# では名前空間の宣言やリソース破棄がパッと思い浮かびます。PowerShellでも何の機能を持たせるかいくつか議論があったのですが、搭載されたのは名前空間の宣言です。

とはいえ、about_Language_Keywordsにはないずさんさです。

https://technet.microsoft.com/ja-jp/library/hh847744.aspx

さらに、WMF 5.0のリリースノートにもないというアンドキュメント感たっぷり。

https://www.microsoft.com/en-us/download/details.aspx?id=46889

どんな感じで使うのか

スクリプトの上部で以下を宣言してあげれば、以降は宣言されたクラスの名前空間が省略可能になります。

using namespace <名前空間>;

例えばList がPowerShell 4.0までこう書く必要があったのが、

New-Object "System.Collections.Generic.List[int]";
New-Object "System.Collections.Generic.Dictionary[[string], [string]]";

一度名前空間を宣言しておけば、List[int]で済むのは幸せでしょう。

using namespace System.Collections.Generic;
New-Object List[int];
New-Object Dictionary[[string], [string]];

あ、PowerShell 4.0まではこういう紹介ありますけど、私はあまり好きじゃないです。どうしても必要と感じた時以外は使いません。

https://qiita.com/stofu/items/eac46f6a4bb4797cc8c9

using namespace のサンプル

クラス構文とファンクション構文それぞれで利用できますが、クラス構文の返戻値の型宣言には使えないので気を付けてください。

https://gist.github.com/guitarrapc/e092ffb40e06fec40216

それぞれこんな感じで帰ってきます。

クラス構文

Adding list 0. Elapsed time 7.3973ms
Adding list 1. Elapsed time 14.068ms
Adding list 2. Elapsed time 14.5463ms
Adding list 3. Elapsed time 14.9423ms
Adding list 4. Elapsed time 15.5296ms
Adding list 5. Elapsed time 15.8406ms
Adding list 6. Elapsed time 16.1545ms
Adding list 7. Elapsed time 16.4804ms
Adding list 8. Elapsed time 16.8308ms
Adding list 9. Elapsed time 17.1498ms
Final elapsed time 19.3839ms
0
1
2
3
4
5
6
7
8
9

ファンクション構文

Adding list 0. Elapsed time 10.4587ms
Adding list 1. Elapsed time 37.9896ms
Adding list 2. Elapsed time 79.5513ms
Adding list 3. Elapsed time 94.0689ms
Adding list 4. Elapsed time 96.9513ms
Adding list 5. Elapsed time 97.2735ms
Adding list 6. Elapsed time 97.6232ms
Adding list 7. Elapsed time 97.9385ms
Adding list 8. Elapsed time 98.3093ms
Adding list 9. Elapsed time 98.6885ms
Final elapsed time 99.0148ms
0
1
2
3
4
5
6
7
8
9

クラス構文早い (そこ

まとめ

アンドキュメントとはいえ、Windows 10で搭載された以上は消えることはないでしょうから使っちゃいましょうかね。

PowerShell 5.0からはジェネリクスの宣言はつらくなくなりそうでよかったです。