Posted On December 27, 2019

PowerShell: Nesting Functions Inside Functions

kimconnect 0 comments
blog.KimConnect.com >> Codes >> PowerShell: Nesting Functions Inside Functions

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;

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post

PowerShell: Quick Snippet to Remove Virtual Machine Snapshots in VMM

$vmNames=@( 'MACHINE1', 'MACHINE2' ) foreach($vmName in $vmNames){ $checkpoint = Get-SCVMCheckpoint -VM $vmName if($checkpoint){$checkpoint|%{Remove-SCVMCheckpoint -VMCheckpoint $_…

PowerShell: List All Hyper-V Snapshots of All VMs in All Clusters in Domain

# listHyperVSnapshots.ps1 $clusterName='*' function listAllHyperVSnapshots([string[]]$clusterName){ function includeRSAT{ $ErrorActionPreference='stop' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 #$rsatWindows7x32='https://download.microsoft.com/download/4/F/7/4F71806A-1C56-4EF2-9B4F-9870C4CFD2EE/Windows6.1-KB958830-x86-RefreshPkg.msu' $rsatWindows7x64='https://download.microsoft.com/download/4/F/7/4F71806A-1C56-4EF2-9B4F-9870C4CFD2EE/Windows6.1-KB958830-x64-RefreshPkg.msu' $rsatWindows81='https://download.microsoft.com/download/1/8/E/18EA4843-C596-4542-9236-DE46F780806E/Windows8.1-KB2693643-x64.msu' $rsat1709…

Web Server Files and mySQL backup and restore

Backup: mysqldump -u [username] -p [password] [databasename] > /home/shares/backup_db.sql   Restore: mysql -u root -p…
Other project: DragonCoin.com