函数(Function)作用域 / 远程函数执行
函数跟变量一样也是有作用域的:Global、Script、Local、Private
Global:作用于整个PowerShell会话,只要PowerShell会话不结束,被Global修饰的变量和函数都是可用的。
Script:仅作用于脚本执行期间,一旦脚本执行完毕,脚本中被Script修饰的变量和函数都不在可用。
Local:默认作用域,变量在当前和嵌套的作用域中可见,复制操作语法能在当前的local作用域中修改变量值。
Private:最严格的作用域,变量仅在当前作用域有效。通过这个关键字,可以在子脚本块中隐藏变量。
声明全局函数:
function global:test
{
param($x,$y)
$x * $y
}
执行函数:
test 2 3
test -y 2 -x 3
该全局函数在通过invoke-command在远程计算机执行的时候,不会被识别。
function ab
{
param($a,$b)
$c=$a-$b
return $c
}
$a=10
$b=20
通过如下方法也可以执行函数
& $function:ab 5 8
查看本机已定义函数:
dir functions:
将本地带有参数的函数,在远程机器上执行:
方法一:
1 function ab 2 { 3 param($a,$b) 4 $c=$a+$b 5 return $c 6 } 7 8 $a=10 9 $b=20 10 invoke-command -computername 172.16.129.62 -Credential $cred -scriptblock ${function:ab} -ArgumentList $a,$b
这样的话,scriptblock中没有办法再加入其他语句执行。
只能先在scriptblock中定义函数,就是在远程计算机定义好函数后再进行调用,如下:
1 invoke-command -computername 172.16.129.62 -Credential $cred -scriptblock { param ($a,$b) 2 function ab 3 { 4 param($a,$b) 5 $c=$a-$b 6 return $c 7 } 8 ab $a $b 9 }-ArgumentList $a,$b
param($a,$b) [或者Function FunctionName($a,$b)] 中的变量是按顺序来接收的,-ArgumentList部分第一个变量即为$a,第二个为$b。如果-ArgumentList部分中的$a在后,$b在前,则$b的值就是第一个传入的变量,$a的值是第二个传入的变量。
-ArgumentList中的$a,$b实际上与param中的 $a,$b 没有任何关系。
方法二:
1 function localFunc($name,$age){ 2 write-host “name=$name,age=$age” 3 } 4 5 function Get-FuncDef($name) 6 { 7 $func="Function:\$name" 8 if(Test-Path $func) 9 { 10 return 'function {0} {{ {1} }}' -f $name,(dir $func).Definition 11 } 12 } 13 14 Invoke-command -ComputerName localhost -ScriptBlock { 15 param($funcDef,$name,$age) 16 Invoke-Expression $funcDef 17 localFunc -name $name -age $age 18 } -ArgumentList (Get-FuncDef localFunc),'xiaoxiaoJiao',30
方法二来自于:http://www.pstips.net/question/2634.html