PowerShellのStart-TranscriptでDOSコマンドの実行結果が保存されない時の対処法

LinuxやUNIXにあるscriptコマンドと同様に、PowerShellにも操作ログを記録するコマンドが存在する。それが『Start-Transcript(Stop-Transcript)』だ。 さて、このコマンドでログを記録する際、ちょっと困った挙動がある。コマンドプロンプト(cmd.exe)のコマンドを実行すると、ログに記録されないのだ…。

実際に、以下のようなコマンドを実行したとしよう。

Start-Transcript
Get-ChildItem
ipconfig
Stop-Transcript

しかし、出力されるログは以下のようになってしまう。

**********************
Windows PowerShell トランスクリプト開始
開始時刻: 20150227002537
ユーザー名  : Work-PC\Work
コンピューター   : WORK-PC (Microsoft Windows NT 6.1.7601 Service Pack 1)
**********************
トランスクリプトが開始されました。出力ファイル: C:\Users\Work\Documents\PowerShell_transcript.20150227002537.txt
PS C:\> Get-ChildItem

    ディレクトリ: C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2014/01/25     22:48            cygwin
d----        2014/01/25     18:04            cygwin64
d----        2014/07/27     21:23            DeploymentShare
d----        2014/01/19     20:24            ipmitool
d----        2014/08/09      7:40            Offiline
d----        2009/07/14     12:20            PerfLogs
d-r--        2015/01/18     17:06            Program Files
d-r--        2015/02/11     17:07            Program Files (x86)
d----        2015/02/26     22:49            PSTools
d----        2014/12/21     16:31            Public
d----        2014/03/03     23:49            teraterm
d----        2014/03/03     22:45            teraterm_log
d-r--        2013/12/21      7:05            Users
d----        2013/12/24      3:29            Windows

PS C:\> ipconfig
PS C:\>
PS C:\> Stop-Transcript
**********************
Windows PowerShell トランスクリプト終了
終了時刻: 20150227002552
**********************

見てわかるように、ipconfigの出力値だけが記録されていない。 これを出力させるには、以下のようにコマンドを実行させると良いだろう。

Start-Transcript
Get-ChildItem
ipconfig | Out-Default
Stop-Transcript

今度は、きちんとログに出力させることが出来た。

**********************
Windows PowerShell トランスクリプト開始
開始時刻: 20150227003014
ユーザー名  : Work-PC\Work
コンピューター   : WORK-PC (Microsoft Windows NT 6.1.7601 Service Pack 1)
**********************
トランスクリプトが開始されました。出力ファイル: C:\Users\Work\Documents\PowerShell_transcript.20150227003014.txt
PS C:\> Get-ChildItem

    ディレクトリ: C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2014/01/25     22:48            cygwin
d----        2014/01/25     18:04            cygwin64
d----        2014/07/27     21:23            DeploymentShare
d----        2014/01/19     20:24            ipmitool
d----        2014/08/09      7:40            Offiline
d----        2009/07/14     12:20            PerfLogs
d-r--        2015/01/18     17:06            Program Files
d-r--        2015/02/11     17:07            Program Files (x86)
d----        2015/02/26     22:49            PSTools
d----        2014/12/21     16:31            Public
d----        2014/03/03     23:49            teraterm
d----        2014/03/03     22:45            teraterm_log
d-r--        2013/12/21      7:05            Users
d----        2013/12/24      3:29            Windows

PS C:\>
PS C:\> ipconfig | Out-Default

Windows IP 構成

イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . :
   IPv6 アドレス . . . . . . . . . . . : 240f:7:63e5:1:80f7:eca9:781f:987d
   一時 IPv6 アドレス. . . . . . . . . : 240f:7:63e5:1:8df6:cc92:d66f:6725
   リンクローカル IPv6 アドレス. . . . : fe80::80f7:eca9:781f:987d%10
   IPv4 アドレス . . . . . . . . . . : 192.168.0.183
   サブネット マスク . . . . . . . . : 255.255.255.0
   デフォルト ゲートウェイ . . . . . : fe80::1eb1:7fff:fe44:2d3c%10
                                       192.168.0.1

Tunnel adapter isatap.{59563340-7AE0-4F33-AD42-27CD5865DD5A}:

   メディアの状態. . . . . . . . . . : メディアは接続されていません
   接続固有の DNS サフィックス . . . :

Tunnel adapter ローカル エリア接続*:

   接続固有の DNS サフィックス . . . :
   IPv6 アドレス . . . . . . . . . . . : 2001:0:5ef5:79fb:147c:1472:8967:8e3c
   リンクローカル IPv6 アドレス. . . . : fe80::147c:1472:8967:8e3c%12
   デフォルト ゲートウェイ . . . . . :
PS C:\>
PS C:\> Stop-Transcript
**********************
Windows PowerShell トランスクリプト終了
終了時刻: 20150227003043
**********************

…う~ん、もうちょっと、Linuxとかの使い勝手に近づいて貰えないものだろうか。 bashからkshになっても、scriptコマンドは問題なく動作してくれるんだけど…