Where to put PowerShell scripts?

Powershell

Powershell Problem Overview


(I can't believe I'm actually asking this, but I am out of brainpower for the day.)

I just wrote my first serious PowerShell script, and I'm really happy with it. I plan to use it every day or so. I want to be able to call it from the Posh command line. I'll give it a verb-noun type name, but for now it's a simple .ps1 and not one of those fancy advanced functions that take params and such.

So where should it go and how do I call it from a Posh command line? I plan to write more! Where should they go?

  • Should it be a function in my profile?
  • Should it go on my path?
  • Does it go in a PSMODULEPATH? What kind of stuff goes there anyway? Does it look recursively or is it just like the normal PATH?

Where do you all put your PowerShell scripts and how do you organize them? I've got a lot of experience making C# and C++ tools and know what to name them and where to put them. And at the other extreme I've done a lot of crappy .bat files which are usually standalone or piled in a heap in some folder. But PowerShell seems to be very different. You can make crappy .bat file type things in it really quickly, or you can be building libraries and sophisticated services with it.

I'd really love some ideas on how I should start organizing these things before I start. Obviously everybody is different, so I'm hoping for some discussion. Thanks!

Powershell Solutions


Solution 1 - 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"

Solution 2 - Powershell

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,...

Solution 3 - Powershell

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

Solution 4 - Powershell

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.

Solution 5 - Powershell

There is an exported variable in PowerShellGet module used in powershell 7.1

$PSGetPath

it has 4 properties

AllUsersModules    : C:\Program Files\PowerShell\Modules
AllUsersScripts    : C:\Program Files\PowerShell\Scripts
CurrentUserModules : C:\Users\username\Documents\PowerShell\Modules
CurrentUserScripts : C:\Users\username\Documents\PowerShell\Scripts

you could use one of those script locations. Install-Script is using them also.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionscobiView Question on Stackoverflow
Solution 1 - PowershellJay BazuziView Answer on Stackoverflow
Solution 2 - PowershellstejView Answer on Stackoverflow
Solution 3 - PowershellAndy SchneiderView Answer on Stackoverflow
Solution 4 - PowershellAndrew JacksonView Answer on Stackoverflow
Solution 5 - PowershellmaciejWView Answer on Stackoverflow