My Powershell $PROFILE module.
Note
I am working on a rewrite of this profile, it turns out importing a bunch of modules that conveniently encapsulate functionality I want also slows the hell out of startup time.
The new profile is in Profiles/Monolith/Monolith.ps1. Instead of importing a bunch of modules, it sources profile "components." Instead of using the Install-CustomProfile.ps1 script, this profile is installed with Install-MonoProfile.ps1. The default installation assumes you do not have a custom prompt (Starship, Oh-My-Posh, etc); you can pass a custom prompt & theme with -Prompt [starship, oh-my-posh] and -StarshipTheme [theme-name] or -OhMyPoshTheme [theme-name].
I will document this better when I fully replace the current profile.
Warning
This script overwrites your Powershell $PROFILE. Make sure to take a backup of that
before running any of the scripts in this repository, especially if you've done
any customization previously.
You can backup your current profile with:
Copy-Item -Path "$($PROFILE)" -Destination "$($PROFILE).orig"To restore it later, run:
Copy-Item -Path "$($PROFILE).orig" -Destination "$($Profile)"This repository includes a module named ProfileModule, which packages custom functions, variables, and aliases for use across PowerShell sessions—effectively turning $PROFILE into a module.
Each custom PowerShell profile sources a shared base template, which handles common setup tasks such as importing custom modules, configuring environment-specific options (e.g., PS5, PS7, PowerShell ISE), and loading the ProfileModule.
Custom profiles, like the Starship profile, build on top of this base. For example, the Starship profile automatically initializes Starship if it is installed.
The ProfileModule adds helpful aliases and functions to every session it's imported into. List the imported aliases with Show-ProfileModuleAliases and the functions with Show-ProfileModuleFunctions.
You can control which profile is installed by editing the config.json file. Each selected profile loads the shared base, then layers on its specific functionality.
Additionally, custom modules can be installed using the Install-CustomPSModules.ps1 script. These are modular and optional—just install what you need.
For example, on a work machine, you might want Azure helpers and Active Directory helpers, but skip the WeatherMod, which wraps wttr.in. To skip a module, simply answer n when prompted during installation.
- Clone the repository
- Copy
config.example.jsontoconfig.json- Edit the file if you want to install a profile other than the default profile
- You can also control which custom modules are installed by editing the
custom_moduleslist in theconfig.jsonfile- Add only the module name, for example if you want to install the
DatetimeHelpersmodules, just add"DatetimeHelpers"to thecustom_moduleslist
- Add only the module name, for example if you want to install the
- Install the profile
- Automatic (scripted install)
- Run
Install-CustomProfile.ps1 - This script will:
- Import the
PowershellProfileSetupmodule - Create a backup of your existing
$PROFILEat$($PROFILE).bak.- You may still want to copy your old
$PROFILE, like:cp $PROFILE "$($PROFILE).orig". This will prevent accidentally nuking any customizations you've made to your$PROFILE
- You may still want to copy your old
- Update the module's manifest file, ensuring all functions & aliases are exported properly.
- Copy the shared base profile to your Powershell path
- Copy the
ProfileModuledirectory (the custom profile module) to yourCustomModules/directory in the same path as your$PROFILE. - Copy/update a custom profile (default:
Default.ps1) to your machine's$PROFILElocation.- Each custom profile imports the
_Base.ps1profile, which loads theProfileModuleand any custom modules defined in theconfig.json'scustom_moduleskey. - To use a different profile, pass a
-ProfileName <profilename>, where<profilename>is the name of a file in theProfiles/directory without the.ps1file extension.- i.e.
-ProfileName Defaultwould use./Profiles/Default.ps1
- i.e.
- Each custom profile imports the
- Import the
- Run
- Manual install
- Open your Powershell profile path (get profile path with:
split-path $PROFILE -parent)- For Powershell 5, it should be
C:\Users\<your-username>\Documents\WindowsPowerShell - For Powershell 7 on Windows, it should be
C:\Users\<you-username>\Documents\PowerShell
- For Powershell 5, it should be
- Copy the
_Base.ps1profile to your Powershell path- Also copy the profile (use the default profile if you are unsure).
- (Optional) Install custom modules
- Create a directory named
CustomModules/in your Powershell profile path - Copy any custom modules you want to use into this path.
- Create a directory named
- Open your Powershell profile path (get profile path with:
- Automatic (scripted install)
After first setup, restart your terminal by closing & reopening it, or reload it in-place by running:
## Powershell 5
& "$PSHOME\powershell.exe" -NoExit -Command "Set-Location -Path '$PWD'"
## Powershell 7
& "$PSHOME\pwsh.exe" -NoExit -Command "Set-Location -Path '$PWD'"To see a full list of the functions exported by this module, run: Get-Command -Module ProfileModule -Commandtype Function.
To see a full list of the aliases exported by this module, run: Get-Command -Module ProfileModule -CommandType Alias.
This repository includes a number of custom modules in the Modules/Custom path. These modules can add additional functionality to your $PROFILE. The _Base.ps1 profile detects a folder CustomModules/ at the $PROFILE path on your host; if present, it will import any modules within, adding extra functionality to your $PROFILE. Keeping modules in this separate CustomModules/ directory prevents them from being auto-initialized by Powershell, allowing you to control module imports with the selected profile.
You can control which modules are installed automatically by the Install-CustomProfile.ps1 script by editing the custom_modules: [] key in your config.json. This key is a list of module names you want to install with your profile, corresponding to a directory in the custom modules path of this repository.
Run the Remove-CustomModulesDir.ps1 script to uninstall all custom modules. This does not affect your custom profile, only the modules in the profile path's CustomModules/ directory.
See the Developing docs
See the Notes documentation pages
Check the docs for useful links