tech.guitarrapc.cóm

Technical updates

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のログをとったりできるのは、なかなか便利ですね。