This set off a lightbulb in my head, and gave me the solution to something I'd been pondering for a while: how to import scripts as libraries (modules, etc, whatever we're calling them these days). You see, if I come up with a really neat function I don't want to have to cut and paste it into every script that uses it, and if I come up with a lot of content, I'd like to be able to share them with people.
This is what I came up with, and it incorporates a few new tricks I picked up along the way to trying to solve this problem. The desired result: I can type in 'import-script scriptname.ps1' and it is automatically imported without having to know the full path to the file.
Some highlights:
- Test-Path is a nice cmdlet for checking the existence of a path on any PSDrive, so that means any Enviornment variable, registry key, file object, etc.
- Exceptions work, but are really hard to get straight. Check out this link for some details.
- The (, (command)) syntax is how I'm forcing the variable to be an array. I might get rid of it later, I think now that I'm using boolean comparison instead of looking for the length of the array to check if any files were found.
- In most examples people use Write-Error instead of echo to print error messages, but I wanted to have the error show up clearly without all of the red words and extra garbage.
- Note that I'm searching everything under the folder pointed to by the PSPATH environment variable. I point mine to C:\PSLibs by default.
function Import-Script ([string]$script) {
$local:ReportErrorShowSource = 0
# Clean up the Exception messages a bit
trap [Exception] {
$errmsg = "`n`tError importing '$script': "
$errmsg += ($_.Exception.Message + "`n")
echo $errmsg
break
}
# Check PSPATH
if (-not (Test-Path "Env:pspath")) {
throw "PSPath environment variable not set."
}elseif (-not (Test-Path $env:pspath)) {
throw "PSPATH environment variable points to invalid path."
}
$files = (, (dir $env:pspath $script -Recurse))
# Make sure we find a single matching file
if ($files.Length -gt 1) {
throw ([string]$files.Length + " files of name '$script' found in PSPATH.")
}elseif (-not $files) {
throw "No files named '$script' found in PSPATH."
}
# Do the needful
. $files[0].FullName
}
No comments:
Post a Comment