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 でも使えるのです。やったー!

  • 過去の記事はこちら

目次

Transcript とは

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

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

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

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

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

PowerShell v4 まで

PowerShell.exe を起動してから次のように行っていました。

Transcript の開始

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

Start-Transcript

これで、勝手に操作が記録されます。

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

もちろん、-Path を付けることで、保存先を指定も可能です。

NAME
    Start-Transcript
    
SYNOPSIS
    Creates a record of all or part of a Windows PowerShell session in a text file.
    
SYNTAX
    Start-Transcript [[-Path] <String>] [-Append] [-Force] [-NoClobber] [-Confirm] [-WhatIf] [<CommonParameters>]
    
    Start-Transcript [[-LiteralPath] <String>] [-Append] [-Force] [-NoClobber] [-Confirm] [-WhatIf] [<CommonParameters>
    ]
    
    
DESCRIPTION
    The Start-Transcript cmdlet creates a record of all or part of a Windows PowerShell session in a text file. The tra
    nscript includes all command that the user types and all output that appears on the console.
    

PARAMETERS
    -Append [<SwitchParameter>]
        Adds the new transcript to the end of an existing file. Use the Path parameter to specify the file.
        
        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -Force [<SwitchParameter>]
        Allows the cmdlet to append the transcript to an existing read-only file. When used on a read-only file, the cm
        dlet changes the file permission to read-write. Even using the Force parameter, the cmdlet cannot override secu
        rity restrictions.
        
        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -NoClobber [<SwitchParameter>]
        Will not overwrite (replace the contents) of an existing file. By default, if a transcript file exists in the s
        pecified path, Start-Transcript overwrites the file without warning.
        
        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -Path <String>
        Specifies a location for the transcript file. Enter a path to a .txt file. Wildcards are not permitted.
        
        If you do not specify a path, Start-Transcript uses the path in the value of the $Transcript global variable. I
        f you have not created this variable, Start-Transcript stores the transcripts in the $Home\My Documents directo
        ry as \PowerShell_transcript.<time-stamp>.txt files.
        
        If any of the directories in the path do not exist, the command fails.
        
        Required?                    false
        Position?                    1
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -LiteralPath <String>
        Specifies a location for the transcript file. Unlike Path, the value of the LiteralPath parameter is used exact
        ly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose 
        it in single quotation marks. Single quotation marks tell Windows PowerShell not to interpret any characters as
         escape sequences.
        
        Required?                    false
        Position?                    1
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -Confirm [<SwitchParameter>]
        Prompts you for confirmation before running the cmdlet.
        
        Required?                    false
        Position?                    named
        Default value                false
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    -WhatIf [<SwitchParameter>]
        Shows what would happen if the cmdlet runs. The cmdlet is not run.
        
        Required?                    false
        Position?                    named
        Default value                false
        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
    None
        
        
    
        You cannot pipe objects to this cmdlet.
    
    
OUTPUTS
    System.String
        
        
    
        Start-Transcript returns a string that contains a confirmation message and the path to the output file.
    
    
NOTES
    
    
        To stop a transcript, use the Stop-Transcript cmdlet.
        
        To record an entire session, add the Start-Transcript command to your profile. For more information, see about_
        Profiles.
        
    
    -------------------------- EXAMPLE 1 --------------------------
    
    PS C:\>start-transcript
    
    
    This command starts a transcript in the default file location.
    
    
    
    
    
    -------------------------- EXAMPLE 2 --------------------------
    
    PS C:\>start-transcript -path c:\transcripts\transcript0.txt -noclobber
    
    
    This command starts a transcript in the Transcript0.txt file in C:\transcripts. The NoClobber parameter prevents an
    y existing files from being overwritten. If the Transcript0.txt file already exists, the command fails.
    
    
    
    
    
    
RELATED LINKS
    Online Version: https://go.microsoft.com/fwlink/p/?linkid=289793
    Stop-Transcript 
なにかてきとーに入力する

てきとーです。

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

としました。

Transcript の終了

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

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

f:id:guitarrapc_tech:20140908044838p:plain

v5 では ISE で Transcriptが可能に

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

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

f:id:guitarrapc_tech:20140908045145p:plain

できましたね。

Visual Studio で使えるのか

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

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

Start-Transcript

f:id:guitarrapc_tech:20140908045716p:plain

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

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

Transcriptを止めます。

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

ログを見ましょう。

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
**********************

PM>$__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

PM>Install-Package RespClient


PM>Stop-Transcript

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

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

まとめ

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

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

標準出力以外にも、Verbose や Errpr ストリームも拾ってくれるので重宝すると思いますよ。

開発者でも VS で、Nuget のログをとったり。ね。