PowerShell5.0たのしい!

PowerShell5.0になっていろいろ便利になったりかゆいとこに手が届いてたりで素敵です
Windows10じゃなくてもWMF5.0をインストールするんだ今すぐ

シェルがカラフルに!

変数やらCmdletやらパラメータ名やらリテラル文字列やら、色がつくようになりました

ss20150731162146

Enter押すと複数行になるときは > が赤くなる、これがなかなかいい

ss20150731161819

上下キーで複数行コマンドを呼び出せる!

以前は複数行コマンド実行後に上キーで呼び出すと一行毎になっちゃっててそのコマンドにちょっと手を入れて再実行ってのが非常に面倒だったけど、複数行一気に呼び出せるしちゃんとどの行も編集できる、すごい

Classが作れる!

自前の型定義がC#で書かなくてもできるようになりました

例えば片や固有のオブジェクトを返す関数があり、片やそのオブジェクトをパイプで受ける関数があったとして
従来であればpsobjectで吐いてpsobjectで受けるみたいなことしてたわけですけどそれだとね、あぶなっかしいわけですよ
だからっていちいちC#で書いてAdd-Typeするのもめんどくさいしっていう

今後は安心だ

class FooBarBaz
{
    [string]   $Foo
    [int]      $Bar
    [datetime] $Baz

    FooBarBaz()
    {
        $this.Foo = 'default'
        $this.Bar = 0
        $this.baz = '1/1'
    }

    FooBarBaz([string] $foo, [int] $bar, [datetime] $baz)
    {
        $this.Foo = $foo
        $this.Bar = $bar
        $this.baz = $baz
    }
}

function New-FooBarBaz
{
    # return [FooBarBaz]::new()
    return New-Object FooBarBaz
}

function Write-FooBarBaz
{
    param
    (
        [parameter(Mandatory,ValueFromPipeline)]
        [FooBarBaz] $FooBarBaz
    )
    process
    {
        Write-Host $FooBarBaz.Foo
        Write-Host $FooBarBaz.Bar
        Write-Host $FooBarBaz.Baz
    }
}

[YourClass]::new()ではなくNew-Object YourClassでインスタンスが作れるようになってました
よかった

PS> $fbb = New-FooBarBaz
PS> $fbb

Foo     Bar Baz
---     --- ---
default   0 2015/01/01 0:00:00

PS> $fbb.Foo = 'fooooo'
PS> $fbb.Bar = 500
PS> $fbb.Baz = '10/10'
PS> $fbb | Write-FooBarBaz
fooooo
500
2015/10/10 0:00:00
PS> $fake = New-Object psobject -Property @{Foo = 'ふー'; Bar = 100; Baz = (Get-Date)}
PS> $fake | Write-FooBarBaz
Write-FooBarBaz : 入力オブジェクトをコマンドのパラメーターにバインドできません。コマンドがパイプライン入力を受け入れないか、または入力
とそのプロパティが、パイプライン入力を受け入れるいずれのパラメーターにも一致しません。
発生場所 行:1 文字:9
+ $fake | Write-FooBarBaz
+         ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (@{Baz=2015/07/3...ar=100; Foo=ふー}:PSObject) [Write-FooBarBaz]、ParameterBindingExcept
io    n
    + FullyQualifiedErrorId : InputObjectNotBound,Write-FooBarBaz

psobject$fakeはちゃんと弾かれてますね
もうpsobjectが特定のプロパティを持ってるかどうかValidateScriptで調べなくてもいいんだよ!
型がはっきりしてればParameterSetも使いやすくなるし、すごくうれしい

Enumが作れる!

列挙型もまたC#で書いてAdd-Typeすりゃよかったんだけど
わざわざしないじゃん

Enum HogeFugaPiyo
{
    Hoge
    Fuga
    Piyo
}

function Test-HogeFugaPiyo
{
    param
    (
        [HogeFugaPiyo] $HogeFugaPiyo
    )
    return $HogeFugaPiyo
}
PS> help Test-HogeFugaPiyo

名前
    Test-HogeFugaPiyo

構文
    Test-HogeFugaPiyo [[-HogeFugaPiyo] <HogeFugaPiyo> {Hoge | Fuga | Piyo}]

ValidateSet地獄から開放されますよ
まぁあれはあれでシンプルでいいんだけど、列挙型のが良い場合ってのはやっぱりあったからね

ディレクトリ名補完に\付く!

PS> cd hog # タブ押す
PS> .hoge\

これね、欲しかったんだよね

パッケージ管理が使える!

ついにWindowsにもパッケージ管理が標準装備されたよ!
PackageManagementモジュールがそれ
chocolateyも使えるので使えるパッケージめっちゃ多い
しかも、予めchocolateyをインストールしておく必要はなくて、必要になったら確認の上でインストールしてくれる

Find-Package -ProviderName chocolatey

-ProviderNameでプロバイダのフィルタができるんだけど、そこでchocolateyを指定した際にchocolateyがないからインストールするかい?って聞かれる

たとえばgit入れたいだったら

Find-Package -ProviderName chocolatey -Name git | Install-Package

スクリプトの構文チェックができるっぽいPSScriptAnalyzerモジュールもこれで入れました
nugetが必要だけどなけれがやっぱり最初にインストールしてくれるので楽ちん

Find-Package -ProviderName PSModule -Name pssc* | Install-Package

シンボリックリンクに対応してる!

今までシンボリックリンクと言ったら

cmd /c mklink /d hoge c:\hoge

ってコマンドプロンプトかまさなきゃいけなかったのと
作ったリンクがシンボリックリンクだってわかんないのがね
不満でしたね

だがしかしそれも過去の話だ

PS> ni hoge -ItemType SymbolicLink -Target c:\hoge
PS> gi .hoge\ | fl Name,LinkType

Name     : hoge
LinkType : SymbolicLink

できた
そしてちゃんとシンボリックリンクだとわかる

作るときはリンク先がファイルかディレクトリかは気にしなくてもいいみたい

Ctrl+Rでコマンド履歴検索できる!

さっき気付きました! (2015/08/03)

ss20150803110425

いいねぇ

さらにさらに!
なんと別のシェルで実行したコマンドも呼べますよ! (2015/08/17)

ss20150817212420

PS1のシェルでWrite-HostしたあとPS2のシェルでCtrl+Rしてみたところ
すごいね!べんりだね!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中