Gyakran előfordul, hogy van egy jópofa segédfüggvényünk, amit szeretnénk egy háttérfolyamatban vagy távoli munkamanet során is használni. Miután ezek külön processzben futnak ezért a fő processzünk függvénye nem látszik a távoli vagy háttérben futó szkriptünk számára, így azt át kell adni.
Legyen a segédfüggvényem a következő:
function MyFunction {
Param([string]$somestring)
"| $somestring |"
}
Ez ugye egyszerűen a paraméterként adott sztringet két függőleges vonal között visszaadja. A háttérben futó szkriptem legyen ez:
$jobscript = {
param(
[PSObject[]] $functions
)
foreach($f in $functions){
[void] (new-item -Path function: -Name $f.name -Value $f.definition)
}
MyFunction -somestring $env:COMPUTERNAME
}
Látható, hogy ez paraméterként vár egy vagy több függvénydefiníciót tartalmazó objektumot. Ezek valójában FunctionInfo típusú objektumok lennének, amit a Get-Command paranccsal tudunk előállítani, viszont a paraméterátadás során lezajló deszerializálás következtében (XML szöveggé alakítja a két processz között átadott objektumokat) sajnos ezekből az objektumokból [Deserialized.System.Management.Automation.FunctionInfo] lesz, amit nem tudunk típusként felvenni, így marad a [PSObject[]]. Végigszalad ezeken a függvénydefiniciós objektumokon (itt most csak egyet adunk át neki) és a New-Item-mel legenerálja a saját környezetében a függvényeket. Majd itt a MyFunction hívással meg is hívja azt, itt konkrétan a gép nevét fogja keretbe foglalni.
Nézzük, hogyan hozzuk létre ezek után a háttérfolyamatot:
start-job -ScriptBlock $jobscript -ArgumentList (Get-Command -Name MyFunction -CommandType Function)
Látható, hogy az ArgumentList-nek a MyFunction definícióját adom át. Nézzük a futtatás eredményét:
PS C:\Users\Tibi> Receive-Job -id 19
| STLENO |
Ugyanígy működik az egész távoli hívásokra is.