PowerShell Profiles

By
James Brundage | MVP
May 10, 2026
As far as PowerShell goes, it's good to keep a low profile.

I've been using PowerShell for a pretty long time, and I have some thoughts on profiles.

Let's share some of what I think makes a good profile and a bad profile.

PowerShell Profiles

The profiles are the script run when a PowerShell launched. Any user can have a profile, and all users can have a profile.

You can get the current profiles by just using $profile. You can create a profile like this:

New-Item -ItemType File -Path $profile -Value {
    "Welcome to PowerShell"
}

You can edit these files in any editor.

You can skip these files by running PowerShell with -NoProfile.

It's a simple as that.

Profiles are Good

Profiles can contain anything, and it will run when you start.

This is a handy feature.

You can run anything in a profile.

Just because you can, doesn't mean you should.

Profile Pitfalls

Profiles have their pitfalls.

The biggest common pitfall is performance.

If your scripts are slow, and you run a lot of them in your profile, PowerShell will take a lot of time to start.

If you set variables, they will be there for you to use. If they have common names and strongly constrained, this might cause unexpected issues running other scripts.

You can mitigate these pitfalls by:

  • Loading only a few small scripts and modules
  • Giving variables obvious names

In my opinion, this is the biggest thing to understand in profiles. Avoid the pitfalls, and profiles can be really useful.

Try to keep a low profile, and things are great.

Perfect Profiles

In my opinion, the perfect profile is short, simple, and sweet.

They will:

  • Edit any environment variables
  • Import any modules
  • Declare any variables
  • Personalize settings

I'd recommend roughly that order.

Personal Profile

At time of writing, this is my VSCode Windows profile:

<#
.SYNOPSIS
    This is my VSCode profile.
.DESCRIPTION
    This is my VSCode profile.  It runs when PowerShell starts in VSCode.
.NOTES
    This is my VSCode profile.
    There are many profiles like it.
    This one is mine.
#>

#region Edit Environment
# I want to load all older modules implicitly
if ($env:PSModulePath  -split ';' -notlike '*windowsPowerShell*') {
    $env:PSModulePath += ";$home\Documents\WindowsPowerShell\Modules"
}
#endregion Edit Environment

#region Import Modules
Import-Module ugit,posh -Force
#endregion Import Modules

#region Declare Variables
$myModules = "$home\Documents\WindowsPowerShell\Modules"
$scratch   = "$home\Documents\WindowsPowerShell\scratch"

$enhancement = @('--label', 'enhancement')
$bug = @('--label', 'bug')
$assignMe = @('--assignee', '@me')
$allIssues = @('--state', 'all', '--limit', 2kb)
$issueJson = @('--json', (
    'assignees','author','body','closed','closedAt',
    'closedByPullRequestsReferences','comments','createdAt',
    'isPinned','labels','milestone','number','reactionGroups',
    'state','stateReason','title','updatedAt','url' -join ','    
))
#endregion Declare Variables

#region Personal Preferences
if ($PSStyle) {
    # Make directories a brighter blue
    $PSStyle.FileInfo.Directory = "`e[1;36m"
}
#endregion Personal Preferences

I'm not saying this is your perfect profile, but it's a pretty good and simple example of what you can do with profiles.

I'd recommend you keep your profiles short, simple, and sweet.

If they are longer than this post, you're in trouble.

Just remember to keep a low profile, and you'll be good to go.

Hope this Helps,

James