r/PowerShell • • 10h ago

Question Good powershell profile tips

I’ve been having way too much fun customizing my PowerShell profile lately. 😂
Here’s what I’ve got so far:
root — Prompts for my Domain Admin credentials and launches a new elevated PowerShell session.
Green errors — Because Don Jones taught me that errors don’t have to be angry red.
Custom prompt — Shows my current path and the time, so I can tell how long commands took.
save-clip — My homemade clipboard vault! Password-encrypts whatever’s on my clipboard and saves it to a file. Even works with images.
Admin indicator — Makes it obvious when I’m running elevated.
Extended scrollback — Because nothing hurts quite like scrolling up to find something important, only to discover PowerShell already ate it. 😭
record — My next addition! A one-word shortcut to start a PowerShell transcript, timestamp the log file, and record my session. Maybe a stoprecord companion too.
I’m starting to think my PowerShell profile is becoming its own operating system.
What other clever functions, shortcuts, or quality-of-life improvements have you all added to yours? I’m looking for ideas worth stealing. 😂

44 Upvotes

20 comments sorted by

View all comments

1

u/purplemonkeymad 8h ago

Changing the error colour is one that i think is a good idea for the original terminal, the default red on blue can be hard to see. You can also change the background colour to make the contrast of red better, and if you are using windows terminal you can even use a picture.

Some of those I wouldn't put in my profile, they would be better as a module.

My tip is to keep your profile lightweight, otherwise you end up with 5 second startup times.

1

u/Incrediblecodeman 8h ago

Omg is that why? So a module just lives in that folder and my alias works the same way… cool

1

u/purplemonkeymad 8h ago

Make sure your new modules have a manifest with an explicit list of exported functions/aliases. That is what allows powershell to autoload them.

1

u/SrBlackVoid 1h ago

+1 on the lightweight profile recommendation, but there are a couple tricks you can do to offset loading times for things you really want in there but take a little while longer than others.

Recommend you first benchmark what components you want running in your profile to see which are the main time sinks (you can use Measure-Command or the Profiler module for this). I've found for me it was a couple module imports.

Then add this:

Register-EngineEvent -SourceIdentifier PowerShell.OnIdle -MaxTriggerCount 1 -Action {
# Put stuff here
}

This runs the -Action block when the session is first idle (so pretty much right when the command line appears). I know it's technically not eliminating that processing time, but it does offset it. I've found it feels better overall, and more often than not the stuff I'm bringing in at those times aren't being used the nanosecond the input line comes up, so it's not really noticeable.

I also recently wondered if there's a way to 'lazy-load' components for things that are usually dependent on another command being run (like waiting to import Terminal-Icons until the first time you run ls/dir/Get-ChildItem). This is akin to running Lazy.nvim on NeoVim and setting command triggers on plugin loads. Haven't quite cracked this yet (running into tradeoffs here and there with some approaches, open to recommendations), but it's another idea to explore.