Create a Transcript of Commands from the Windows PowerShell ISE

ScriptingGuy1

Summary: Create a transcript of commands from the Windows PowerShell ISE in this Microsoft Scripting Guys how-to article.

 

Microsoft Scripting Guy Ed Wilson here. One of the things I enjoy about using the Windows PowerShell console is the transcript feature. When I am playing around on the Windows PowerShell console, experimenting, trying out new ideas, and exploring ideas, it is great not to worry about losing any cool code I discover. In my Windows PowerShell console profile, I use the Start-Transcript Windows PowerShell cmdlet to start a transcript when I am working in the Windows PowerShell console. I even have a function I wrote, which automates this—it is in my Windows PowerShell console profile. The function is shown here.

Start-Trans function

function start-Trans([switch]$debug)
{
 # to see debuging information startTrans -debug
 if($debug)
   {
    $debugPreference = “continue”
   } #end if debug
 $dte = [dateTime]::Get_Today().DayOfWeek.tostring()
   write-debug $dte
 $dte = $dte + “_” + [dateTime]::now.hour
   write-debug $dte
 if(([datetime]::now.toLocalTIme()) -match “AM”)
    {
       Write-debug “Inside if …”
     $dte = $dte + “_AM”
       write-debug $dte
    } #end if…
 else
    {
       write-debug “Inside else …” 
     $dte = $dte + “_PM”
       write-debug $dte
    } #end else
   write-debug “Starting transcript … c:\trans\$dte.txt”
 start-transcript -path “c:\trans\$dte.txt”
} #end start-Trans


When I start the Windows PowerShell console, the transcript automatically starts, as shown in the following image.

Image of transcript automatically starting

Any information I return to the Windows PowerShell console screen is logged to the log file. This is shown in the following image.

Image of information logged to log file

Unfortunately, the Windows PowerShell ISE does not have a transcript command. The Start-Transcript command generates an error, which is shown here:

PS C:\Users\ed.NWTRADERS> Start-Transcript
Start-Transcript : This host does not support transcription.
At line:1 char:17
+ Start-Transcript <<<<
    + CategoryInfo          : NotImplemented: (:) [Start-Transcript], PSNotSup
   portedException
    + FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.Start
   TranscriptCommand

Using the Windows PowerShell ISE object model, it is possible to create a transcript command that will work inside the Windows PowerShell ISE. I decided to create two functions, even though we do not actually need both functions. The Get-LogNameFromDate function will create a text file in a specific location. The file name is based upon the current date and time. The time portion uses the hour, minute, and second. The date portion of the file name uses the year, month, and day. As is usually the case, the help information is much more involved than the code that actually does the work.

The code that creates the file name for the log is shown here. I use parameter substitution to create the file name. The file name comprises four parts: the path, the name prefix, the time, and the extension. After the file name is created, the New-Item cmdlet is used to create the file.

$$logname = “{0}\{1}{2}.{3}” -f $path,$name, `

    (Get-Date -Format yyyyMMdd-HHmmss),”Txt”
New-Item -Path $logname -ItemType file | out-null

In the Start-ISETranscript function, the text that is in the output pane is obtained from the text property of the output object and is written to the log file. The thing that is strange about the text property of the output object is that it is only available while the script is running. When the script ceases to run, the property is not available. This means you cannot access the output pane text from the Windows PowerShell ISE command pane. This portion of the Start-ISETranscript function is shown here.

$psISE.CurrentPowerShellTab.Output.Text >> $logname

The two functions are shown here.

Windows PowerShell ISE transcript functions

Function Get-logNameFromDate
{
  <#
   .Synopsis
    Creates a log name from date
   .Description
    This script creates a log from a date.
   .Example
    Get-logNameFromDate -path “c:\fso” -name “log”
    Creates a file name like c:\fso\log20100914-122019.Txt but does not
    create the file. It returns the file name to calling code.
   .Example
    Get-logNameFromDate -path “c:\fso” -name “log” -Create
    Creates a file name like c:\fso\log20100914-122019.Txt and
    create the file. It returns the file name to calling code.
   .Parameter path
    path to log file
   .Parameter name
    base name of log file
   .Parameter create
    switch that determines whether log file or only name is created
   .inputs
    [string]
   .outputs
    [string]
   .Notes
    NAME:  Get-LogNameFromDate
    AUTHOR: ed wilson, msft
    LASTEDIT: 09/10/2010 16:58:06
    KEYWORDS: parameter substitution, format specifier, string substitution
    HSG: WES-09-25-10
   .Link
     Http://www.ScriptingGuys.com
 #Requires -Version 2.0
 #>
 Param(
  [string]$path = “c:\fso”,
  [string]$name = “log”,
  [switch]$Create
 )
 $logname = “{0}\{1}{2}.{3}” -f $path,$name, `
    (Get-Date -Format yyyyMMdd-HHmmss),”Txt” if($create)
  {
   New-Item -Path $logname -ItemType file | out-null
   $logname
  }
 else {$logname}
} # end function get-lognamefromdate

Function Start-iseTranscript
{
  <#
   .Synopsis
    This captures output from a script to a created text file
   .Example
    Start-iseTranscript -logname “c:\fso\log.txt”
    Copies output from script to file named xxxxlog.txt in c:\fso folder
   .Parameter logname
    the name and path of the log file.
   .inputs
    [string]
   .outputs
    [io.file]
   .Notes
    NAME:  Start-iseTranscript
    AUTHOR: ed wilson, msft
    LASTEDIT: 09/10/2010 17:27:22
    KEYWORDS:
    HSG: WES-09-25-10
   .Link
     Http://www.ScriptingGuys.com
 #Requires -Version 2.0
 #>
  Param(
   [string]$logname = (Get-logNameFromDate -path “C:\fso” -name “log” -Create)
  )
  $transcriptHeader = @”
**************************************
Windows PowerShell ISE Transcript Start
Start Time: $(get-date)
UserName: $env:username
UserDomain: $env:USERDNSDOMAIN
ComputerName: $env:COMPUTERNAME
Windows version: $((Get-WmiObject win32_operatingsystem).version)
**************************************
Transcript started. Output file is $logname
“@
 $transcriptHeader >> $logname
 $psISE.CurrentPowerShellTab.Output.Text >> $logname
} #end function start-iseTranscript

To use the Start-ISETranscript function, add the call to the function at the bottom of your script. The script does not have to be saved or have a name. This is shown in the following image. One thing to keep in mind is that the entire contents of the output pane will be written to the log file. This means that if you run the script two or three times and do not clear the output pane, you could have the results from several scripts in your transcript log.

Image of function in action

The output of the Start-ISETranscript function is shown in the following image. As you can tell, the header to the transcript file is extremely similar to the second image shown above that was produced by the Start-Transcript cmdlet from the Windows PowerShell console.

Image of output of Start-ISETranscript function

 

We invite you to follow us on Twitter and Facebook. If you have any questions, send email to us at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow for another edition of the Weekend Scripter. Until then, peace.

 

Ed Wilson and Craig Liebendorfer, Scripting Guys

0 comments

Discussion is closed.

Feedback usabilla icon