tech.guitarrapc.cóm

Technical updates

PowerShell v5 の新機能紹介 - PowerShell ISE でリモートファイルを直接編集可能に

さて前回の記事でPowerShell v5をコアとするWindows Management Framework 5.0 Preview September 2014 (v5.0) について紹介しました。 その機能詳細を触りつつ、何が変わるのかお伝えしていきます。

今回は、まずWMF 5.0のリリースノートにない機能です。 ついにPowerShellでリモートログイン中に、リモートファイルを直接エディタで編集可能になります。

  • 過去の記事はこちら

https://tech.guitarrapc.com/entry/2014/09/05/065912

*nuxのsshではリモートサーバーのファイルを直接操作できる

vimに限りませんが、こんな操作が*nuxでは当然可能です。

ssh testserver # ssh で testserver にログイン
vim hoge.log # vim で hoge.log を編集

この時、vimで開く画面はsshでそのままシームレスに展開されます。

image

リモートターミナルの中で、新たに画面を立ち上げることなく、シームレスにエディタでファイルを編集する。

ローカルとリモートで変わらないというのは、作業効率・操作性の両面で重要です。

PowerShell 4.0まではリモート先のファイルを直接エディタ展開編集できなかった

PowerShell 4.0までは、 sshに変わるWSManでのリモートと謳うわりに直接リモート上のファイルをエディタで編集する機能がなかったのです。

これは、とてつもなく苦痛を伴い、また私がもはやEnter-PSSessionを使わない理由の1つでもありました。

PowerShell v5からISE上でリモートファイルを直接編集できる

そう、PowerShell v5のISEならね。要件は1つだけです。

をインストールしてください。

手順

いたって簡単です。

PowerShell ISE を起動

image

PowerShell.exeではできません。PowerShell ISEからのみ可能です。

Enter-PSSession で対象のサーバーにリモートログインします。

Enter-PSSession -ComputerName "対象のIPやホスト名" -Credential "同じ認証でないならユーザー名/パスワードをPSCredentialで渡す"

例えばこうです。

Enter-PSSession -ComputerName 192.168.11.21 -Credential &#40Get-Credential&#41

psedit で対象のファイルを開きます。

psedit "リモート先のファイル名"

例えばこうです。

psedit d:\hoge.log

image

ISE の別タブにリモートファイルが開かれます! オワリ!

[Remote File]選択したファイル名

の形式で開かれたでしょう!!

image

もちろん、ふつーにローカルのファイルと同様に操作できます。

保存すれば、リモートファイルが保存されます。

まとめ

これだけ覚えましょう。

1. Enter-PSSession
2. psedit ファイル名

もう、sshでvimを打つたびに悔しがらなくて済む! *1

*1:と、思うじゃろ? 動作が違うからそうでもない

PowerShell v5 の新機能紹介 - PowerShell ISE や Visual StudioでもTranscript が扱えるように

今回も前回に続きPowerShell v5をコアとするWindows Management Framework 5.0 Preview September 2014 (v5.0) の機能詳細を触りつつ、何が変わるのかメモです。

今回から、WMF 5.0のリリースノート機能詳細を見ていきます。

  • Audit Windows PowerShell usage by transcription and logging

このTranscriptですが、結論からいうとPowerShell ISEをはじめとするホストプログラムでも、Transcriptが扱えるようになります。

つまり、Visual Studioでも使えるのです。やったー!

  • 過去の記事はこちら

https://tech.guitarrapc.com/entry/2014/09/05/065912

https://tech.guitarrapc.com/entry/2014/09/08/042747

Transcript とは

「PowerShell.exeを使っていて、すべての自分の操作ログを残したい」そう思った時にどうするか? Transcript の出番です。

Transcriptは、PowerShellの全操作をPowerShell.exeに表示されたそのまま自動的にログ保存してくれます。

まさにさくっと自動化にとって便利ないい子です。

しかしTranscriptには制限がありました。 PowerShell ISEで利用できなかったのです。これが、PowerShell v5では変わります。

そう、PowerShell v5なら「PowerShell v5でTranscript」が実行できるようになります。

PowerShell 4.0 まで

Transcriptを開始するにはPowerShell.exeで次のCmdletを実行しました。

PS> Start-Transcript

トランスクリプトが開始されました。出力ファイル: C:\Users\Administrator\Documents\PowerShell_transcript.20140908044205.txt

パスを付けることで、保存先を指定も可能です。

PS C:\Users\Administrator> "hoge"
hoge
PS C:\Users\Administrator> "fuga"
fuga

終了するには、次のCmdletを入力します。

PS> Stop-Transcript
トランスクリプトが停止されました。出力ファイル: C:\Users\Administrator\Documents\PowerShell_transcript.20140908044205.txt

あるいは、シャットダウンイベントを検知しても自動的に終了します。

Transcript の中身

どんなログが保存されたのか見てみましょう。

**********************
Windows PowerShell トランスクリプト開始
開始時刻: 20140908044205
ユーザー名  : GREENDEPLOY\Administrator
コンピューター     : GREENDEPLOY (Microsoft Windows NT 6.2.9200.0)
**********************
トランスクリプトが開始されました。出力ファイル: C:\Users\Administrator\Documents\PowerShell_transcript.20140908044205.txt
PS C:\Users\Administrator> "hoge"
hoge
PS C:\Users\Administrator> "fuga"
fuga
PS C:\Users\Administrator> Stop-Transcript
**********************
Windows PowerShell トランスクリプト終了
終了時刻: 20140908044230
**********************

どうでしょうか。すばらしいですね。とりあえず操作ログを! と思ったら、何も考えずStart-Transcriptをすればokです。 -Appendもあるので、追記も問題なしです。

ISE ではTranscriptがサポートされていなかった

そう、v4まではPowerShell ISE上でのTranscriptがサポートされていませんでした。

v4でPowerShell ISE上で、 Start-Transcriptを実行すると次のメッセージが表示されて実行を拒否されます。

Start-Transcript : このホストはトランスクリプションをサポートしていません。
発生場所 行:1 文字:1
+ Start-Transcript
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotImplemented: (:) [Start-Transcript], PSNotSupportedException
    + FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.StartTranscriptCommand

image

v5 では ISE で Transcriptが可能に

PowerShell v5でISEをはじめとするホストプログラムでTranscriptが可能になります。VSでも可能になるでしょう。

PowerShell v5をいれたISEでStart-Transcriptを実行すると?

image

できましたね。

Visual Studio で使えるのか

もちろんできます。.NET開発者の標準ツールと化したNuGetのPackage Manager Console。これは、PowerShellなのです。そう、Install-PackageもPowerShell Cmdletです。

では、Package Manager ConsoleでStart-Transcriptをしてみましょう。

Start-Transcript

image

できましたね? それでは、 RespClientをいれてみましょう。

PS> Install-Package RespClient
'RespClient 1.1.7' をインストールしています。
'RespClient 1.1.7' が正常にインストールされました。

Transcriptを止めます。

PS> Stop-Transcript
トランスクリプトが停止されました。出力ファイル: C:\Users\acquire\Documents\PowerShell_transcript.WINDOWS81X64.Tr1Yaudt.20140908045501.txt

ログを見ましょう。

PS> cat C:\Users\acquire\Documents\PowerShell_transcript.WINDOWS81X64.Tr1Yaudt.20140908045501.txt

**********************
Windows PowerShell transcript start
Start time: 20140908045502
Username: WINDOWS81X64\acquire
RunAs User: WINDOWS81X64\acquire
Machine: WINDOWS81X64 (Microsoft Windows NT 6.3.9600.0)
Host Application: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe
Process ID: 9904
**********************

PS> $__pc_args=@();$input|%{$__pc_args+=$_};if(Test-Path Function:\TabExpansion2){(TabExpansion2 $__pc_args[0] $__pc_args[0].length).CompletionMatches|%{$_.CompletionText}}else{TabExpansion $__pc_args[0] $__pc_args[1]};Remove-Variable __pc_args -Scope 0;
Install-Package
OneGet\Install-Package

PS> Install-Package RespClient


PS> Stop-Transcript

**********************
Windows PowerShell transcript end
End time: 20140908045929
**********************

ログがでましたね! OngetモジュールのInstall-Packageと競合しているところがずさんで素敵です。

まとめ

Transcriptは、日の目を浴びみくい小さな機能ですが、操作ログという意味ではとても便利です。

自動化でログを考えるのがめんどくさい? でもバックグラウンドでどう動いたか知りたい? Transcriptしてください。

標準出力以外にも、VerboseやErrprストリームも拾ってくれるので重宝します。開発者でもVSで、Nugetのログをとったりできるのは、なかなか便利ですね。

PowerShell v5 の新機能紹介 - Zipファイルの操作が可能に

今回も前回に続きPowerShell v5をコアとするWindows Management Framework 5.0 Preview September 2014 (v5.0) の機能詳細を触りつつ、何が変わるのかメモです。

  • Manage .ZIP files with new cmdlets

つまり、 Zipファイルが標準で扱えるようになります。Windowsようやくここまで来たか感ですね。

  • 過去の記事はこちら

https://tech.guitarrapc.com/entry/2014/09/05/065912

https://tech.guitarrapc.com/entry/2014/09/08/042747

https://tech.guitarrapc.com/entry/2014/09/08/050311

Cmdlet

対象のCmdletは2つです。

CommandType Name             Version Source
----------- ----             ------- ------
Function    Compress-Archive 1.0.0.0 Microsoft.PowerShell.Archive
Function    Expand-Archive   1.0.0.0 Microsoft.PowerShell.Archive

Compress-Archive

圧縮します。

NAME
    Compress-Archive

SYNOPSIS
    The Compress-Archive cmdlet can be used to zip/compress one or more files/directories.

SYNTAX
    Compress-Archive [-Path] <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatIf] [-
    Confirm] [<CommonParameters>]

    Compress-Archive -LiteralPath <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatI
    f] [-Confirm] [<CommonParameters>]


DESCRIPTION


PARAMETERS
    -Path <String[]>

        Required?                    true
        Position?                    1
        Default value
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false

    -LiteralPath <String[]>

        Required?                    true
        Position?                    named
        Default value
        Accept pipeline input?       true (ByPropertyName)
        Accept wildcard characters?  false

    -DestinationPath <String>

        Required?                    true
        Position?                    2
        Default value
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CompressionLevel <String>

        Required?                    false
        Position?                    named
        Default value                Optimal
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -Update [<SwitchParameter>]

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -WhatIf [<SwitchParameter>]

        Required?                    false
        Position?                    named
        Default value
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -Confirm [<SwitchParameter>]

        Required?                    false
        Position?                    named
        Default value
        Accept pipeline input?       false
        Accept wildcard characters?  false

    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).

INPUTS

OUTPUTS


RELATED LINKS

ファイル圧縮

例えば、 D:\hoge.logをd:\hoge.zipに圧縮したいなら?

Compress-Archive -Path D:\hoge.log -DestinationPath d:\hoge.zip

生成されました。

    Directory: D:\


Mode          LastWriteTime Length Name
----          ------------- ------ ----
-a---- 2014/09/08      5:10 213260 hoge.zip

中身を見てみましょう。

image

フォルダ圧縮

フォルダの圧縮します。例えば、D:\GitHub\valentia\Valentaiをd:\valentia.zipに圧縮してみましょう。 こんな構造です。

image

実行してみましょう。ファイルと変わりません。判定は自動的に行ってくれます。

Compress-Archive -Path D:\GitHub\valentia\valentia -DestinationPath D:\valentia.zip

サイズがそれなりだったので、実行するとプログレスバーが出ました。

image

生成されたzipを見てみると、指定したパスの構造そのままにできている?

image

と思いきや、Lhazなど3rdパーティソフトで見ると、フォルダがファイルになっていたりして構造が壊れています。

image

一方で、Windows標準のExplorerなら平気です。

image

んー、微妙なのでConnectにはあげませんでしたが、どうしたものか。

条件は容易で、「ファイルを含まないフォルダが存在していると、ルートのフォルダがファイルに変わります」

再現コードです。

# Reproduce
mkdir d:\hoge\hoge\1\2\3\4
mkdir d:\hoge\hoge\1\2\3\5
New-Item d:\hoge\hoge\log.log
New-Item d:\hoge\hoge\1\2\3\3.log
New-Item d:\hoge\hoge\1\2\3\4\4.log
Compress-Archive d:\hoge\hoge -DestinationPath d:\hoge.zip

基本的に、 Windows標準のExplorerは逆に他で利用できないZipを生成するので、 LhazやWinRARなどはその辺安定しているので微妙ですね。

解凍

解凍も簡単です。Expand-Archive使います。

Compress-Archiveに対して、Expland-Archiveはうまく解凍してくれるのですばらです。

例えば、c:\に解凍するならこうです。

Expand-Archive -Path d:\valentia.zip -DestinationPath c:\

image

Zipへのアイテム追加

Compress-Archiveには、 Updateスイッチがあります。

これを使うことで、既存のzipにアイテムを追加可能です。

例えば、 d:\valentia.zipに、 d:\GitHub\DayBreakJPフォルダを追加するならこうです。

Compress-Archive -Path D:\GitHub\DayBreakJP -DestinationPath D:\valentia.zip -Update

うまく追加されていますね!

image

まとめ

Zipの処理には、 DSCのArchiveリソースという手段もありましたが、Cmdletでできるのはうれしいですね!

PowerShell Team から Hardware-Management-Module がOpen Source として公開されました

さて、WMF v5 Preview Septemberの話題ばかりでは楽しくない(?) ので、少し別の話題を。

PowerShell Teamは、日本ではそれほど活発ではないですが、結構コミュニティと密接にかかわっています。有名どころでは、PowerShell.OrgやOneGetでしょう。

https://github.com/OneGet/oneget

その割に、Windows Management FrameworkがOpen Source化されてなかったりはありますが、それはおいておいて。

さて、今回、PowerShell Teamから、ハードウェア管理に関するモジュールがオープンソースとしてGitHubに公開されました。

リポジトリ

*1りましょう!

https://github.com/WindowsPowerShell/Hardware-Management-Module

利用可能な PowerShell バージョン

PowerShell 3.0から利用可能です。

.psd1を見ると明示されています。

PowerShellVersion = "3.0"

なにができるの

結構いろいろです。

CommandType Name                      Version Source
----------- ----                      ------- ------
Function    Clear-CIMRecordLog        1.2.1.0 HardwareManagement
Function    ConvertTo-CIMOctetString  1.2.1.0 HardwareManagement
Function    Disable-CIMAccount        1.2.1.0 HardwareManagement
Function    Enable-CIMAccount         1.2.1.0 HardwareManagement
Function    Get-CIMAccount            1.2.1.0 HardwareManagement
Function    Get-CIMAccountMgmtService 1.2.1.0 HardwareManagement
Function    Get-CIMBootOrder          1.2.1.0 HardwareManagement
Function    Get-CIMComputerSystem     1.2.1.0 HardwareManagement
Function    Get-CIMConsoleRedirection 1.2.1.0 HardwareManagement
Function    Get-CIMHardwareInventory  1.2.1.0 HardwareManagement
Function    Get-CIMLogEntry           1.2.1.0 HardwareManagement
Function    Get-CIMNumericSensor      1.2.1.0 HardwareManagement
Function    Get-CIMOSStatus           1.2.1.0 HardwareManagement
Function    Get-CIMPowerState         1.2.1.0 HardwareManagement
Function    Get-CIMRecordLog          1.2.1.0 HardwareManagement
Function    Get-CIMRegisteredProfile  1.2.1.0 HardwareManagement
Function    Get-CIMRole               1.2.1.0 HardwareManagement
Function    Get-CIMSoftwareInventory  1.2.1.0 HardwareManagement
Function    New-CIMAccount            1.2.1.0 HardwareManagement
Function    Remove-CIMAccount         1.2.1.0 HardwareManagement
Function    Set-CIMAccount            1.2.1.0 HardwareManagement
Function    Set-CIMBootOrder          1.2.1.0 HardwareManagement
Function    Set-CIMPowerState         1.2.1.0 HardwareManagement
Function    Set-CIMRole               1.2.1.0 HardwareManagement
Function    Suspend-CIMAccount        1.2.1.0 HardwareManagement
Function    Test-CIMRMCPConnection    1.2.1.0 HardwareManagement

ぜひ試してください。

OS状態から、電源状態まで、いろいろできます。

まとめ

まとまってない!

この調子で、PowerShell公開されたらいいなぁ。

*1:ふぁぼ

PowerShell v5 の新機能紹介 - PowerShell で Class構文が利用可能になります

今回も前回に続きPowerShell v5をコアとするWindows Management Framework 5.0 Preview September 2014 (v5.0) の機能詳細を触りつつ、何が変わるのかメモです。

ついにクラスがPowerShellで操作できます。やったー!

過去の記事はこちら

https://tech.guitarrapc.com/entry/2014/09/05/065912

https://tech.guitarrapc.com/entry/2014/09/08/042747

https://tech.guitarrapc.com/entry/2014/09/08/050311

https://tech.guitarrapc.com/entry/2014/09/08/062313

※ 追記 : PowerShel v5がリリースされました

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

できること

簡単にいうと、いわゆるobject-orientedなスタイルでの記述です。例を挙げると、

  • Enumの宣言
  • Class構文
  • Properties
  • Methods
  • Inheritance (継承)

などなど。

これを使って、

  • DSC Resourceの記述
  • 独自型をPowerShel Scriptだけで規定、利用
  • 規定した型のデバッグ
  • 例外処理も行える

できないこと

現状まだできないことは多くあります。

  • Propertyがpublicしかなく、ReadOnlyなどはできない
  • Get-DSCResourceでは、Class構文で書かれたリソースを検知できない
  • DSCエンジンキャッシュが、PowerShellスクリプトモジュールに向けて作りこまれているため、DebugModeを有効にする
  • New-Objectでのクラス生成ができず、Static Methodである[ClassName]::New()を使う

カスタムタイプ

規定できるものをさくっと見てみましょう。

Class Keyword

.NET Frameworkに基づく新しいクラスを規定します。

メンバーはパブリックですが、パブリックな範囲は「モジュールスコープ」に限定されています。 現段階では、 スクリプトやモジュールで規定したMyClassクラスを、モジュール/スクリプトの外部からMyClassのような形式で検知できません。 つまり、文字列からクラスを検知できないため、New-Objectを使うことができません。

構文

Class MyClass
{
}

Enum Keyword と列挙

もしJuly Previewを使っていた人がいたら破壊的変更になります。Enumのデリミタが,ではなく、,になりました。

ついにきました。Enumです。PowerShellでは、Enumが相当活躍するので、独自に規定できるのは大事です。

従来は、Class同様にC# で書いて、Add-Typeで読み込む必要がありました。

たとえば、Valentiaではこういった型を持っています。

https://gist.github.com/e7a1091012e818293fd0

これが、Enumキーワードを使えばこんな感じで規定できます。

https://gist.github.com/fabcfb3dde796e8cc223

素晴らしいです。もうTyr{}Catch{} も不要です。AppDomainで苦しまずにすみます。

構文

Enum MyEnum
{
}

制限

現状は、Enumerator ValueはEnumキーワード実行時に決まっている必要があります。 つまり、何かのコマンドの結果にできません。

たとえば、こうはできます。

Enum Colour
{
    Blue = [int]::MaxValue
}

が、こうはできません。

Enum Colour2
{
    Yellow = &#40Get-childItem&#41.Count
}

このような警告がでます。

image

算術結果はサポートしているのでこういうのはありです。

Enum SomeEnum { Max = 42 }
Enum OtherEnum { Max = [SomeEnum]::Max + 1 }

Import-DscResouce

これまでもキーワードでしたが、正しくDynamic Keywordとなりました。

PowerShellは、このキーワードを使って、Rootモジュールを走査して[DSCResource()]属性をもったクラスを検知します。

Properies

ModuleInfoにImplementingAssemblyフィールドが追加されました。

これは、スクリプトモジュール内のクラスや、C# Cmdletで書かれたバイナリモジュールのためのです。なので、 ModuleTypeがManufest、つまりpsd1だとでません。

ImplementingAssemblyフィールドをリフレクションすると、どんなリソースがモジュールに含まれるかわかります。つまり、PowerShellや他の言語からどんなリソースが存在しているか調べられます。

Initializing

フィールドの初期化として

[int] = 5;

などとかくこともできます。

Static

Staticがサポートされているので、こうかけます。

Static [int] = 5;

やったね。

image

すべてPublic

現状はPublicのみです

ClassのスコープがLexical Scopeなので、クラス外部からの影響やクラス外部への影響はありません。

関数Function{}やScirptBlock Function{}で悩まされたあの問題が完全回避できるのはうれしいですね。

しかし、すべてPublicかぁ。

Constructor

Constructorも利用可能です。

C# 同様にクラスと同名である必要があります。また、overload可能です。

Static Constructorも利用可能で、Static PropertyはStatic Constructorの前に初期化されます。

同様に、インスタンスプロパティは、non-Static Constructorの前に初期化されます。

制限

現状は、C#にあるようなConstructorを別のConstructorから呼ぶシンタックスはないので次のような記述はできません。

: this()

インスタンス生成

クラスのインスタンス生成は、従来のNew-Objectがまだ使えないのでスタティックメソッドを利用します。

$MyClass = [MyClass]::new&#40&#41

これで、$MyClassでもにょれます。

Constructorの例を見てみましょう。

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

thisがないのは、現状の制限です。

Method

PowerShellのClass構文におけるMethodは、ScriptBlockつまり匿名コンストラクタを使っています。

ScriptBlockのEnd節のみ使っているのが特徴です。型付けできるのでいい感じです。

https://gist.github.com/guitarrapc/9650ddf0b4bd6a4a223e

属性

Classには、特定の属性が用意されています。

  • DscResource
  • DscResourceKey
  • DscResourceMandatory

です。いずれもDSC Resourceとして組む場合のキーになるものです。

スコープ

先ほど説明したとおり、Lexical Scopeです。

リリースノートのサンプルはこんな感じですね。

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

まとめ

どうでしょうか。少しはとっつきやすくなったでしょうか。 初めはDefとかあって、Ruby... え。でしたが、リリースノートからはC# を意識しているようです。