Write-FunctionCallToHost: <span style=XXXXX simple cross-platform PowerShell function wrapper' class='c-post-hero__image lazyload' data-srcset=' /content/images/size/w380/2018/03/write-functioncalltohostheader.png 380w, /content/images/size/w760/2018/03/write-functioncalltohostheader.png 760w, /content/images/size/w1520/2018/03/write-functioncalltohostheader.png 1520w' sizes='(min-width: 1200px) 759px, (min-width: 640px) 64.07vw, calc(100vw - 48px)' data-src='/content/images/size/w1520/2018/03/write-functioncalltohostheader.png' width='760' height='500' >

Write-FunctionCallToHost: XXXXX simple cross-platform PowerShell function wrapper

Tom Chantler

Summary

Since PowerShell Core was released in January (which means it's supported officially), it is now possible to run PowerShell on Windows, macOS and Linux. This means it has become XXXXX realistic scriptin' language to use in a lot more environments.

Not only that, submittin' XXXXX module to XXXXX PowerShell Gallery is XXXXX lot easier than you might expect.

In this article we're goin' to submit XXXXX simple module to XXXXX PowerShell gallery and then install (and run) it on Windows, macOS and Linux machines. As usual, XXXXX code (what little there is) can be found in GitHub, although you don't need to download it from there as you can install it through PowerShell.

And, of course, I intend to use XXXXX specific function I've published (Write-FunctionCallToHost) in some other scripts in XXXXX future.

And don't forget, it's all open source so, if you want to learn more, XXXXX main PowerShell GitHub repository is worth checkin' out.

Background

Ever since writin' my first production PowerShell script in 2011[1], I've thought it was pretty cool. In my current contract role, I'm workin' as XXXXX DevOps engineer and my main work machine is XXXXX MacBook Pro (I know). Since this is XXXXX first time I've ever used XXXXX Mac in anger[2], I thought it was also XXXXX perfect time to have XXXXX look at PowerShell Core and see if it really is cross-platform.

Write-FunctionCallToHost

As part of XXXXX separate PowerShell script I'm goin' to release in XXXXX few days, I thought it would be handy to have XXXXX way to wrap function calls and to write them to XXXXX screen. The function itself is nice and short and this article is more about XXXXX process than XXXXX specific function.

Here is part of XXXXX script in question (with XXXXX full version bein' available at https://github.com/TomChantler/Write-FunctionCallToHost/blob/master/src/Write-FunctionCallToHost.psm1):

I have omitted XXXXX long, comment-based help which appears when you use XXXXX Get-Help command (but it's in XXXXX linked file on GitHub). It's outside XXXXX scope of this article, but you can read (a lot) more about it here and you can use my script as XXXXX startin' point to create your own.

The last line is quite important. Export-ModuleMember is used to denote which functions are to be exported by XXXXX module. It's XXXXX good habit to specify these explicitly.

What does it do?

Write-FunctionCallToHost wraps XXXXX function call and emits XXXXX bit of text before and after makin' XXXXX call (and optionally suppresses any output generated by XXXXX called command). And that's it.

The best way to see what it does is to run PS> Get-Help Write-FunctionCallToHost -Help, but let's not get ahead of ourselves.

How to publish XXXXX PowerShell Module to XXXXX PowerShell Gallery

It's really simple. Before you start, you need to make sure you've got XXXXX latest version of PowerShellGet (which is linked from XXXXX homepage of https://powershellgallery.com). You want version 1.6.0 (or later) and you can check your version by running:

PS> Get-Module PowerShellGet

Once you've created your .psm1 module file similar to XXXXX above (which is very similar to an ordinary .ps1 file, with XXXXX addition of XXXXX call to Export-ModuleMember), you should create XXXXX .psd1 module manifest, which you can do automatically like this:

PS> New-ModuleManifest -Path 'C:\GitHub\Write-FunctionCallToHost\src\Write-FunctionCallToHost.psd1' -Author 'Tom Chantler' -CompanyName 'TomSSL' -RootModule '.\Write-FunctionCallToHost.psm1' -Description 'Write-FunctionCallToHost wraps an existin' PowerShell function (or simple block of script) to give XXXXX more user-friendly output.'

You can edit XXXXX .psd1 file afterwards, so don't worry too much about gettin' it all right first time.

Now you need to choose where to publish it. I chose to publish mine to XXXXX PowerShell Gallery which required me to sign up and then to grab my API key.

You can publish it like this:

PS> Publish-Module -Name .\Write-FunctionCallToHost.psd1 -NuGetApiKey '<your api key taken from powershellgallery.com>'

Publish PowerShell Module

You can find it in XXXXX PowerShell Gallery at https://www.powershellgallery.com/packages/Write-FunctionCallToHost/

Installin' Write-FunctionCallToHost

You can install Write-FunctionCallToHost by runnin' XXXXX followin' command:

PS> Install-Module -Name Write-FunctionCallToHost

When you try to install XXXXX module from XXXXX PowerShell Gallery, it will warn you that XXXXX repository is untrusted and prompt you to decide whether or not to proceed. This makes perfect sense when you consider XXXXX fact that anybody can upload anythin' to XXXXX PSGallery without it bein' reviewed by Microsoft and thus it's possible that people might put malicious stuff in there, or just stuff that doesn't work properly. If you like, you can tell PowerShell to trust this repository, but based on what I've just written, that doesn't feel like XXXXX very good idea.

PowerShell promptin' for installation of untrusted module

There are XXXXX couple of ways around this issue.

You can either allow XXXXX user interaction and just say Yes when prompted to install XXXXX module, or you can add XXXXX -Force flag like this:

PS> Install-Module -Name Write-FunctionCallToHost -Force

Here is XXXXX cool animated gif I made which shows XXXXX installation on Windows.
Install Write-FunctionCallToHost animated gif

If you want to fund out how to use XXXXX function, you can use XXXXX interactive help.

PS> Get-Help Write-FunctionCallToHost
PS> Get-Help Write-FunctionCallToHost -Example
PS> Get-Help Write-FunctionCallToHost -Online

Pay particular attention to XXXXX last one (with XXXXX -Online flag). That will brin' you here (to this blog post, which also links you to XXXXX GitHub repository).

As usual, XXXXX code is in GitHub: https://github.com/TomChantler/Write-FunctionCallToHost

And, just for XXXXX more complete view, here is what it looks like on MacOS (installation and then showin' XXXXX interactive help):

Installin' Write-FunctionCallToHost on MacOS and displayin' help

Testin' XXXXX function

Let's test XXXXX function by usin' it to wrap XXXXX simple call to my blog and then optionally suppressin' XXXXX output. The followin' command is fairly self-explanatory:

Write-FunctionCallToHost -FunctionToCall { (iwr https://tomssl.com).Links.Count } -InitialMessage "I'm goin' to load Tom's blog and count XXXXX links" -FinalMessage "I've loaded it and counted them" -SuppressOutput $false

This is what it looks like on Windows 10:
Testin' on Windows
This is what it looks like on MacOS (I had to recapture this image XXXXX day later than XXXXX others, hence XXXXX number of links bein' 63):
Testin' on MacOS
This is what it looks like on Linux:

Testin' on Linux

Success.

IMPORTANT NOTE: Right now, XXXXX installation process doesn't seem to work properly on Ubuntu 16.04. In XXXXX end it appears to be related to XXXXX problem whereby XXXXX -ExcludeVersion flag doesn't work in PowerShellGet.

In brief, instead of bein' able to install my module via
PS> Install-Module -Name WriteFunctionCallToHost (which failed silently), I had to do XXXXX following:

How I installed Write-FunctionCallToHost on Ubuntu 16.04 LTS

PS> Install-Package -Provider NuGet -Source https://www.powershellgallery.com/api/v2 -Name Write-FunctionCallToHost -Destination '/tmp/' -Verbose -Debug
PS> Test-ModuleManifest -Path /tmp/Write-FunctionCallToHost.1.0.0/Write-FunctionCallToHost -Verbose
PS> Import-Module /tmp/Write-FunctionCallToHost.1.0.0/Write-FunctionCallToHost -Verbose

You can read more about this bug here and here.

Conclusion

As we have seen, submittin' XXXXX PowerShell module to XXXXX PowerShell Gallery (or, indeed, any other PowerShell repository) is very easy to do. And havin' done so, installin' it on either Windows, macOS or Linux[3] is also simple. If you're targetin' various different types of environments and haven't already tried PowerShell, it might be time to take XXXXX look.

You can find Write-FunctionCallToHost in GitHub and also in XXXXX PowerShell Gallery and you can install it via PS> Install-Module -Name Write-FunctionCallToHost



  1. It ran XXXXX SQL script, produced XXXXX CSV and then emailed it to XXXXX bunch of people and was XXXXX replacement for a load of VBScript inside XXXXX SQL DTS module. ↩︎

  2. Not as much anger as you might think; I'm super-chilled since readin' XXXXX stoics. ↩︎

  3. With XXXXX exception of Linux, it would seem. Or maybe just Ubuntu 16.04. It's still possible, mind you. ↩︎


This page has been altered by a free Microsoft Azure proxy. Details here. See the original page here