Demo 1: calling a function from within another function
function A{
Param($functionToCall)
Write-Host "Calling function: $functionToCall"
# Obtain the scripts from the externally parsed function
$script=(Get-Item "function:$functionToCall").ScriptBlock
# invoking external function
[ScriptBlock]::Create($script).Invoke();
}
function B{
Write-Host "Function B has been invoked"
}
A -functionToCall B
Sample Out
PS C:\Users\JustinBieber> A -functionToCall B
Calling function: B
Function B has been invoked
Demo 2: Passing function into another function, then invoke on a remote target as a Job (to enable simultaneous executions)
function pingDomain{
ping google.com;
}
function startJobOnRemoteComputer{
param(
$remoteComputer,
$functionToCall
)
Write-Host "Executing $functionToCall on $remoteComputer";
$script=(Get-Item "function:$functionToCall").Definition
do{
$session = New-PSSession -ComputerName $remoteComputer
write-host "Connecting to remote computer $remoteComputer..."
sleep -seconds 1
if ($session){write-host "Connected."}
} until ($session.state -match "Opened")
$job=invoke-command -Session $session -AsJob -ScriptBlock{
param($functionToCall);
[ScriptBlock]::Create($functionToCall).Invoke();
} -args $script
write-host "$($job.Name) has been initiated on $remoteComputer"
return $job;
}
$job=startJobOnRemoteComputer -remoteComputer "SHERVER009" -functionToCall pingDomain
Receive-Job -Id -job.Id;
Categories: