Execute Local Functions Remotely
To demonstrate how to do this, I’ll use a famous Hell-World example. I have written an extremely simple function that writes “Hello, World!” to the console. It is called MyFunction and has no parameters. I’ve loaded to into my local PowerShell session and to run it remotely I will use Invoke-Command. Here is the trick, place a $ symbol out side the curly braces of the scriptblock. Then put Function: inside the scriptblock before the name of the function as seen below.
1 |
<span class="k">function </span>MyFunction <span class="o">()</span><br data-jekyll-commonmark-ghpages="" /><span class="o">{</span><br data-jekyll-commonmark-ghpages="" /> <span class="nb">Write-Host</span> <span class="s1">'Hello, World!'</span><br data-jekyll-commonmark-ghpages="" /><span class="o">}</span><br data-jekyll-commonmark-ghpages="" /><br data-jekyll-commonmark-ghpages="" />Invoke-Command -ComputerName DC1 <span class="se">`</span><br data-jekyll-commonmark-ghpages="" />-ScriptBlock <span class="k">${</span><span class="nv">Function</span>:MyFunction<span class="k">}</span> |
Using Parameters
While the above example works, most functions aren’t that simple. Most require several parameters and how do you pass those parameters to the function running remotely? To illustrate, I’ve written another simple function called Get-NetConfig. Provided an InterfaceIndex and AddressFamily parameter, it will gather information about the network settings of the system it runs on. In the below example I am passing the values for the InterfaceIndex and AddressFamily by using the -ArgumentList parameter of Invoke-Command.
1 |
<span class="k">function </span>Get-NetConfig<br data-jekyll-commonmark-ghpages="" /><span class="o">{</span><br data-jekyll-commonmark-ghpages="" /> <span class="o">[</span><span class="na">CmdletBinding</span><span class="o">()]</span><br data-jekyll-commonmark-ghpages="" /> <span class="k">Param</span> <span class="o">(</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$InterfaceIndex</span>,<br data-jekyll-commonmark-ghpages="" /> <span class="nv">$AddressFamily</span><br data-jekyll-commonmark-ghpages="" /> <span class="o">)</span><br data-jekyll-commonmark-ghpages="" /><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$NodeName</span> <span class="o">=</span> <span class="nv">$env</span>:ComputerName<br data-jekyll-commonmark-ghpages="" /> <span class="nv">$NetAdapter</span> <span class="o">=</span> <span class="nb">Get-NetAdapter</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$IPconfig</span> <span class="o">=</span> <span class="nb">Get-NetIPAddress</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span> -AddressFamily <span class="nv">$AddressFamily</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$DNS</span> <span class="o">=</span> <span class="o">(</span><span class="nb">Get-DnsClientServerAddress</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span><span class="o">)</span>.ServerAddresses<br data-jekyll-commonmark-ghpages="" /> <span class="nv">$obj</span> <span class="o">=</span> <span class="o">[</span>PSCustomObject]@<span class="o">{</span><span class="nv">NodeName</span><span class="o">=</span><span class="nv">$NodeName</span>;<span class="nv">IPAddress</span><span class="o">=</span><span class="nv">$IPconfig</span>.IPAddress;MacAddress<span class="o">=</span><span class="nv">$NetAdapter</span>.MacAddress;DNS<span class="o">=</span><span class="nv">$DNS</span><span class="o">}</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$obj</span><br data-jekyll-commonmark-ghpages="" /><span class="o">}</span><br data-jekyll-commonmark-ghpages="" /><br data-jekyll-commonmark-ghpages="" />Invoke-Command -ComputerName DC1 <span class="se">`</span><br data-jekyll-commonmark-ghpages="" />-ScriptBlock <span class="k">${</span><span class="nv">Function</span>:Get-NetConfig<span class="k">}</span> <span class="se">`</span><br data-jekyll-commonmark-ghpages="" />-ArgumentList <span class="s1">'5'</span>,<span class="s1">'IPV4'</span> |<br data-jekyll-commonmark-ghpages="" /><span class="nb">Select-Object </span>NodeName,IPaddress,MacAddress,DNS |
Changing Parameter Order
Often you do not specify the parameters in the order they are listed in the function. This is a problem, because executing function remotely requires they be in the exact same order. This means that if I provided AddressFamily first and IPAddress second in the above example it would error out. There are ways around this of course. Method 1 would be to set default values for all the parameters, but that’s not an ideal solution. Method 2 is setting the position of the parameter to the order you want. In the below code I’m giving AddressFamily the first position by specify 0 and assigning position 1, the second position to AddressFamily.
1 |
<span class="k">function </span>Get-NetConfig<br data-jekyll-commonmark-ghpages="" /><span class="o">{</span><br data-jekyll-commonmark-ghpages="" /> <span class="o">[</span><span class="na">CmdletBinding</span><span class="o">()]</span><br data-jekyll-commonmark-ghpages="" /> <span class="k">Param</span> <span class="o">(</span><br data-jekyll-commonmark-ghpages="" /> <span class="o">[</span>Parameter<span class="o">(</span>Position <span class="o">=</span> 1<span class="o">)]</span> <span class="c1">#<--- Second Param</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$InterfaceIndex</span>,<br data-jekyll-commonmark-ghpages="" /> <span class="o">[</span>Parameter<span class="o">(</span>Position <span class="o">=</span> 0<span class="o">)]</span> <span class="c1">#<-- First Param</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$AddressFamily</span><br data-jekyll-commonmark-ghpages="" /> <span class="o">)</span><br data-jekyll-commonmark-ghpages="" /><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$NodeName</span> <span class="o">=</span> <span class="nv">$env</span>:ComputerName<br data-jekyll-commonmark-ghpages="" /> <span class="nv">$NetAdapter</span> <span class="o">=</span> <span class="nb">Get-NetAdapter</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$IPconfig</span> <span class="o">=</span> <span class="nb">Get-NetIPAddress</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span> -AddressFamily <span class="nv">$AddressFamily</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$DNS</span> <span class="o">=</span> <span class="o">(</span><span class="nb">Get-DnsClientServerAddress</span> -InterfaceIndex <span class="nv">$InterfaceIndex</span><span class="o">)</span>.ServerAddresses<br data-jekyll-commonmark-ghpages="" /> <span class="nv">$obj</span> <span class="o">=</span> <span class="o">[</span>PSCustomObject]@<span class="o">{</span><span class="nv">NodeName</span><span class="o">=</span><span class="nv">$NodeName</span>;<span class="nv">IPAddress</span><span class="o">=</span><span class="nv">$IPconfig</span>.IPAddress;MacAddress<span class="o">=</span><span class="nv">$NetAdapter</span>.MacAddress;DNS<span class="o">=</span><span class="nv">$DNS</span><span class="o">}</span><br data-jekyll-commonmark-ghpages="" /> <span class="nv">$obj</span><br data-jekyll-commonmark-ghpages="" /><span class="o">}</span><br data-jekyll-commonmark-ghpages="" /><br data-jekyll-commonmark-ghpages="" />Invoke-Command -ComputerName DC1 <span class="se">`</span><br data-jekyll-commonmark-ghpages="" />-ScriptBlock <span class="k">${</span><span class="nv">Function</span>:Get-NetConfig<span class="k">}</span> <span class="se">`</span><br data-jekyll-commonmark-ghpages="" />-ArgumentList <span class="s1">'IPV4'</span>,<span class="s1">'5'</span> | <span class="c1">#<---- Changed Arguement Order</span><br data-jekyll-commonmark-ghpages="" /><span class="nb">Select-Object </span>NodeName,IPaddress,MacAddress,DNS |
No Comments