Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to put PowerShell scripts?

Tags:

powershell

I put my personal scripts in the same folder as my profile. I can then back up & version them together. My profile begins with:

$ProfileRoot = (Split-Path -Parent $MyInvocation.MyCommand.Path)
$env:path += ";$ProfileRoot"

My recommendations: - Store the script in a directory as you wish, e.g. c:\posh - Add the directory to $env:path

$env:path += ";c:\posh"

This ensures that you may be in other directory, say c:\windows, but you can call the script

[c:\windows] > sampl[TAB] # it expands the name of file to sample.ps1, then hit enter

If your file sample.ps1 contains functions definitions and you import it every time, then I would consider adding this line to your $profile file

. c:\posh\sample.ps1

Concerning script organization.. just several dirs according to the purpose of the scripts :) Personal, dev, external (downloaded), samples,...


With V2, you can create a modules directory in the WindowsPowerShell directory where your profile is. PS will automatically look in that directory to load modules when you run import-module. I created a "Scripts" directory under WindowsPowerShell as well that is a sibling directory of Modules.

I use my profile to set some directories using variables with the following code:

PS>  cat $Profile
$scripts = "$(split-path $profile)\Scripts"
$modules = "$(split-path $profile)\Modules"
$docs    =  $(resolve-path "$Env:userprofile\documents")
$desktop =  $(resolve-path "$Env:userprofile\desktop")

PS> cat variable:\scripts
C:\Users\andy.schneider\Documents\WindowsPowerShell\Scripts

PS>  cat variable:\modules
C:\Users\andy.schneider\Documents\WindowsPowerShell\Modules

This is what I do:

note: substitute "ModuleName" for something meaningful.

Create a module and save it in the global modules folder as "C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ModuleName\ModuleName.psm1". e.g.:

function global:FancyFunction() {
   # do something interesting here.
}

Export-ModuleMember -function FancyFunction 

Open your powershell profile and add the following line to make sure that your module is loaded every time you start a powershell session:

Import-Module ModuleName -Force

You can easiliy find your powershell profile by typing:

notepad $profile

When you open a new powershell session, you should be able to call your function from the console or from other scripts without having to do anything else.