functions/Copy-PSFunction.ps1
#This assumes you've already created a PowerShell Remoting session #You must use a PSSession #get the locally loaded function # $f = $(Get-Item function:\Get-Foo).scriptblock #copy it to the remote session # Invoke-Command { New-Item -Name Get-Foo -Path Function: -Value $($using:f)} -session $s #now you can use it remotely # Invoke-Command { Get-Foo } -session $s Function Copy-PSFunction { [cmdletbinding()] [OutputType("Deserialized.System.Management.Automation.FunctionInfo")] [Alias("cpfun")] Param( [Parameter(Position = 1, Mandatory, ValueFromPipeline, HelpMessage = "Enter the name of a local function.")] [ValidateNotNullOrEmpty()] [string[]]$Name, [Parameter(Mandatory, HelpMessage = "Specify an existing PSSession")] [System.Management.Automation.Runspaces.PSSession]$Session, [switch]$Force ) Begin { Write-Verbose "[$((Get-Date).TimeOfDay) BEGIN ] Starting $($MyInvocation.MyCommand)" } #begin Process { foreach ($item in $Name) { #verify the function Exists $funPath = Join-Path -Path Function: -ChildPath $item Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] Validating $funPath" if (Test-Path -Path $funPath) { Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] Copying $item to $($session.computername)" $f = $(Get-Item -Path $funPath).scriptblock Invoke-Command -scriptblock { New-Item -Name $using:item -Path Function: -Value $($using:f) -force:$using:force} -session $Session } #if Test-Path Else { Write-Warning "Can't find a local function called $item." } } #foreach item } #process End { Write-Verbose "[$((Get-Date).TimeOfDay) END ] Ending $($MyInvocation.MyCommand)" } #end } #close Copy-PSFunction |