Powershell,pas功能作为表达式到远程计算机

问题描述:

我有脚本库上的常见帮手等方法,我想直接使用它们在PowerShell远程处理,我怎么不知道如何将它们传递到其他目标脚本机器。Powershell,pas功能作为表达式到远程计算机

我试图通功能的脚本块,并在远程服务器上执行它,在本地计算机的一切工作正常:

function test { write-host "abc" } 
Invoke-Command -ScriptBlock {Param($1) & $1} -ArgumentList ${Function:Test} 

打印“ABC”

但是以下不工作:

function test { write-host "abc" } 
Invoke-Command -ScriptBlock {Param($1) & $1} -ArgumentList ${Function:Test} -ComputerName "OTHERCOMPUTER" -Credential $cred 

术语'写主机'abc“'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 + CategoryInfo:ObjectNotFound:(写主机 “ABC”:字符串)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException

任何想法有什么不好?

编辑: 为了澄清下面的答案,其中函数本身在scriptblock中定义不适用,因为函数是从仅位于使用远程的计算机上的通用脚本文件中获取的。它们就像“GetConfigurationFromAppConfig”,“SelectFromDatabase”等。

如果我为每个脚本块写入函数,那么我必须一遍又一遍地复制相同的代码。我不想使用“通用”脚本位置,因为每个计算机都可以在块内部加载脚本(例如“\ SharedLocation \”),因为它很脆弱(很多依赖性),并且必须针对每个服务器远程处理(大量维护)。

+0

刚刚发现一个更好的答案! http://stackoverflow.com/questions/8448808/using-invoke-command-scriptblock-on-a-function-with-arguments – Raf

Invoke-Command -ScriptBlock {function test { write-host "abc" }; test} -ComputerName "OTHERCOMPUTER" -Credential $cred

+0

编辑的问题,这是我试图避免的解决方案。 – savpek

+0

回复:编辑 - 您必须让远程计算机“意识到”您要执行的额外功能,方法是将它们包含在脚本块中或通过'import-module'导入它们。 – Raf

另一种选择是使用[ScrtiptBlock]::Create()建立使用在您的本地会话已​​经声明函数定义脚本。这样可以节省您不必手动重新创建远程脚本调用内部的函数的所有代码:

function test { write-host "abc" } 

$SB = [ScriptBlock]::Create(@" 
function test {$Function:test} 
test 
"@) 

$SB 


function test { write-host "abc" } 
test 

然后,只需调用远程计算机上$ SB。

编辑:

每补充意见,如果你有一个脚本文件的远程计算机上的库,其中的函数声明,你可以点源他们在您的脚本块:

$SB = { 
. 'c:\scripts\myfunctions.ps1' 
test 
} 

Invoke-Command -ScriptBlock $SB -ComputerName 'OTHERCOMPUTER' 

在我需要利用自定义函数/资源库的情况下,我只在我的scriptblock中使用Import-Module。这对我来说似乎是最干净的实现......我可以在这里访问数百个自定义函数。