Függvény átadása háttérfolyamatoknak és távoli munkameneteknek

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.



Word To HTML Converter