First off, I really feel like there should be an apostrophe in there somewhere – Windows’ Terminal maybe? Regardless, I recently decided to give Windows Terminal a try after a colleague (thanks Kristy!) mentioned she’s been using it some. And then, I swear, I was seeing it everywhere. I could see some advantages, so I installed. Now, I think I might have a problem. I wanted a quick reference for myself and thought it would be a decent blog since I kept sharing them with colleagues (whether they wanted to know or not – I get excited/you’re welcome Chad!)
What is it and why I’m a little obsessed (skip if you’re just here for the tips/tricks)
I figured this was some random third party app before I started looking into it. Nope, it is from Microsoft – so that could be positive or negative. The big “selling points” for me were having multiple tabs and custom themes. Since I sometimes (always) have a questionable number of terminals open between various PowerShell, Command Prompt, and WSL options, being able to easily contain and differentiate them would be nice. And nice it is.
Terminal defaulted to PowerShell for me, which was fine. It will also pull in the other terminals you have, so if you are running PowerShell 7 alongside 5, it’ll show up. As will WSL distros, Azure Cloud Shell, etc. When I got some time to fiddle with it, I realized how well it fits into my workflow. The ability to have profiles for different tasks and access all the options without having a ton of Windows open improved my efficiency quite a bit. Not knowing which PowerShell window was IPPSSession versus ExchangeOnline versus general versus whatever made moving between them frustrating. You can change themes in the regular terminals, but it’s kind of a pain. I’m now happily down to usually just Windows Terminal and PowerShell ISE when I need that. Much of the time I’m down to Windows Terminal with multiple tabs.
What makes it powerful is the ability to set profiles, pass some commands when calling profiles, and starting with multiple tabs open. You can also specify the path to start in for a profile, which comes in handy. All can have different themes, tab titles, and tab icons. The ability to have clear visual indicators is incredibly helpful, particularly when you might be doing some IR and need to have access to multiple terminal options. For some reason, using the right commands in the right places is more efficient. Who knew? It also lets me more clearly separate which has admin permissions. I’m using different background colors and specific icons to make it easy to get where I need to be to do that next thing. And as silly it is, opening with the terminals I’m typically in all day every day without having to do anything makes me ridiculously happy. People like to tell me that’s me being efficient, but it feels kind of lazy to me. I guess it’s like writing a function to run a 1 line command in PowerShell – it may only save a few keystrokes each time, but the cumulative savings really adds up.
Set Up Tips
The kind of time consuming part is getting things setup for effectiveness. A lot of the options can be configured via the Settings GUI – Startup options, Appearance, Profile basics, etc. There are additional color schemes available by searching online, but I’ve been tweaking what already there because that’s a rabbit I don’t need to chase right now. Pick your profile name, icon, font, color scheme, background image, etc. to whatever makes you happy. Create custom color schemes in the Color Schemes section and apply to your profiles to help differentiate them.
Pass commands starting the profile
If you look at the profiles, you’ll notice there’s a “Command Line” spot with just the typical
wsl.exe -d <distro>, etc. there. What is cool/useful is being able to pass commands here. So if you want to always start a profile to connect to a computer remotely because you do this ALL THE TIME, you can:
#Include -NoProfile if you want to avoid having a profile loaded
PowerShell.exe -NoExit -Command Enter-PSSession -ComputerName <computername>
PowerShell.exe -NoExit -Command Connect-IPPSSession -UserPrincipalName <UPN>
PowerShell.exe -NoExit -Command Connect-ExchangeOnline -UserPrincipalName <UPN>
You might also want to jump straight into Python:
cmd.exe /k python #Or whatever you start Python with in Command Prompt
wsl.exe -d <distro> python3 #Or whatever you start Python with in your various WSL distros
This was a game changer because of how “efficient” I like to be – not having the extra step of connecting or whatever is phenomenal. The ability to pass arguments starting profiles gives you a ton of options. You may need to do a little testing to determine if you need to tweak the syntax a bit, but it’s pretty straightforward.
Start with multiple tabs
This part moved Windows Terminal from nice to awesome…because apparently opening the extra tabs is really hard for me. You do need a more recent version as some of the older ones don’t allow for it. Make sure you determine whether you want to use a distro or a profile because that impacts the syntax. You can also use this to specify colors and other things, but I prefer to do that with color schemes.
All you need to do is open up the JSON file with the settings (which will conveniently tell you if you’ve forked and work off an older version while you troubleshoot) and add this line – I put it after the
default profile line:
#Put profiles with spaces in quotes and set focus tab as desired, 0 is default profile
"startupActions": "; new-tab -p <profile> ; new-tab -p <profile>; focus-tab -t 0",
Add as many as you would like and there you go.
You can also put things in different panes so you have multiple options visible at the same time. Look through the documentation to see your options. Here are a few handy things:
# Open vertical or horizonal pane with default profile
ALT+SHIFT+= (Vertical) ALT+SHIFT+- (Horizontal)
# Open from profile menu
ALT+(Click new tab or dropdown to select profile)
# Move between panes
There’s not a great way to open split panes with different profiles from the keyboard yet, but a decent workaround is to either make a profile that runs the command or put in the command manually (I’d probably make this a PowerShell function if I wanted to use it a lot…yeah that happened, here’s the GitHub in case I develop it more. I would put this in the CurrentUserAllHosts profile version unless you want to keep it separated for some reason. If you create a profile and keep it in your first 9, you can open with CTRL+SHIFT+<#>. Pretty handy if there are 2 profiles that you need to split panes with frequently. Both of these will open in a new window, which is not that big of a deal. I’d rather deal with that than take hands off the keyboard.
# Add options as desired and put profile names in quotes if they contain spaces
# This will open in a new window either way
wt -p <profile>; split-pane -p <profile>
# PowerShell Function quick version - I might expand this more over time in my Github
Function splitpanes ($profile1, $profile2, $type)
wt -p $profile1`; split-pane -p $profile2 `-$type
The documentation is fairly good and a great place to start. It’s not always easy to find exactly what you are looking for though. Here are a few handy links to get started with:
Windows Terminal Startup Settings | Microsoft Docs
Windows Terminal command line arguments | Microsoft Docs
Windows Terminal Actions | Microsoft Docs
Launch Windows Terminal with multiple tabs (frakkingsweet.com)
cmd | Microsoft Docs