Using the new PowerShell ISE transcript tool


Summary: Ed Wilson, Microsoft Scripting Guy, talks about using the new Windows PowerShell 5.0 ISE Transcript tool.

 

One of my favorite features for Windows PowerShell has always been the transcript tool. I mean, it seems like it was made for Windows PowerShell … I guess it was. What am I talking about? Well, one of my favorite ways to spend time is plugging in various Windows PowerShell commands to see what they might do. Then I try to shorten them, make them leaner, or more powerful, or modify them to better suit my needs. Back when I used to do this on other systems, I would end up copying the command, and storing it in a notebook, or in a text file. With the Windows PowerShell transcript tool, I have not only a record of my commands, and errors they generate, but also the output that comes from the command. It is a great way to learn stuff about Windows PowerShell.

The problem, is that the Start-Transcript tool only worked in the Windows PowerShell console, and I have been using the Windows PowerShell ISE more and more … so I did like any good Windows PowerShell person would do, and I wrote my own transcript tool for the Windows PowerShell ISE.

But now … there is a Windows PowerShell ISE transcript tool built into Windows PowerShell ISE … beginning with Windows PowerShell 5.0 on my Windows 10 computer.

Start the PowerShell transcript

So, the first thing I do is open the Windows PowerShell ISE, and in the command pane, I type the command Start-Transcript. The command outputs the path to the transcript. This appears here:

PS C:\> Start-Transcript

Transcript started, output file is C:\Users\mredw\Documents\PowerShell_transcript.EDL

T.6VtWcOHE.20160329162630.txt

 

Now I type a command. I want one that will not take up too much space, so I select the last process in the collection of objects returned by the Get-Process cmdlet (gps is an alias for get-Process). This command appears here:

PS C:\> gps | select -Last 1

 

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName

——-  ——    —–      —– —–   ——     —  — ———–

293      18     5416      10536   116            2808   0 ZeroConfigService

 

Ok, now I stop the transcript. To do this, I use the Stop-Transcript cmdlet. This command once again outputs the path to the transcript file. This command and output appears here:

PS C:\> Stop-Transcript

Transcript stopped, output file is C:\Users\mredw\Documents\PowerShell_transcript.EDL

T.6VtWcOHE.20160329162630.txt

 

Note that the transcript file is the path to my documents folder in my profile, then the word transcript and a computer name, a bit of random number, and then the date and time. I could never remember all of tha, so I copy and paste it and try to open it in notepad. The result? An error. This appears here:

PS C:\> notepad C:\Users\mredw\Documents\PowerShell_transcript.EDL

T.6VtWcOHE.20160329162630.txt

T.6VtWcOHE.20160329162630.txt : The term ‘T.6VtWcOHE.20160329162630.txt’ is not

recognized as the name of a cmdlet, function, script file, or operable program.

Check the spelling of the name, or if a path was included, verify that the path is

correct and try again.

At line:2 char:1

+ T.6VtWcOHE.20160329162630.txt

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo          : ObjectNotFound: (T.6VtWcOHE.20160329162630.txt:String

) [], CommandNotFoundException

+ FullyQualifiedErrorId : CommandNotFoundException

 

The problem is the path is so long, that it actually breaks into two lines. When I attempted to paste it back, I picked up a random break and the command failed. So, now I do a copy and paste again, but this time I hit backspace to remove the random break. Yeah, it works. Here is the log file:

HSG-3-29-16-01

A better way to handle this long log file path

A better way to handle this semi random long file name in a deep profile path, is to simply capture the returned output from the Start-Transcript command. Unfortunately, what returns is simply a string. This appears here:

PS C:\> $a = Start-Transcript

PS C:\> $a.GetType()

IsPublic IsSerial Name                                     BaseType

——– ——– —-                                     ——–

True     True     String                                   System.Object

 

PS C:\> $a

Transcript started, output file is C:\Users\mredw\Documents\PowerShell_transcript.EDL

T.wnH7glru.20160329163437.txt

 

When I wrote my transcript function, I also wrote a function called Get-TranscriptFile that parsed this string into a path that I could directly pass to notepad to open the transcript. I still have that function, but another cool cmdlet in Windows PowerShell 5 makes that a bit obsolete. That is because Windows PowerShell 5 includes a cool cmdlet called ConvertFrom-String that will create an object from a string. Here is an example:

PS C:\> Convertfrom-String -InputObject $a

P1 : Transcript

P2 : started,

P3 : output

P4 : file

P5 : is

P6 : C:\Users\mredw\Documents\PowerShell_transcript.EDLT.wnH7glru.20160329163437.txt

 

The part I want is the P6 property. The command appears here:

Notepad (Convertfrom-String -InputObject $a).p6

Sweet! So much easier than having to write my own functions and the like. PowerShell 5 for the win!

I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. Also check out my Microsoft Operations Management Suite Blog. See you tomorrow. Until then, peace.

Ed Wilson, Microsoft Scripting Guy

Comments (3)

  1. PetSerAl says:

    What wrong with just `$a.Path`? Regardless of `$a` is just a string it have extended property `Path` attached to it. You way also is not reliable. In Russian it is `Транскрибирование запущено, выходной файл FileName`, so that file name would be `P5`, not `P6`.

  2. TheGhost82 says:

    I have the following line in my ISE profile:
    Start-Transcript -Path “C:\Logs\ISE-$(Get-Date -Format ddMMyyy).log” -Append | Out-Null

    this way the path also shows me when the session was started, that can be usefull if working on something over multiple days. No need to mess around with long path names anymore!

    Also I remove the logs after 7 days by running:
    $logs = Get-ChildItem C:\Logs -filter “*.log”
    ForEach($log in $logs) {
    For ($p = 1; $p -le $logs.Count; $p++) {
    Write-Progress -Activity “Loading ISE” -Status “Removing old logs” -Id 2 -PercentComplete ($p/$logs.Count*100);
    $date = ((Get-Date) – $log.CreationTime).Days
    If ($date -gt 7 -and $log.PsISContainer -ne $True) {$log.Delete()}
    }
    }

    (and yes that is also in the profile) 🙂

  3. Gary says:

    I have been using this command line in a script since PowerShell 2 to get a log of everything that has happened in the ISE session:
    $psise.CurrentPowerShellTab.Output.Text > $outputfile

Skip to main content