【问题标题】:Powershell, pas function as expression to remote computerPowershell,将函数作为表达式传递给远程计算机
【发布时间】:2014-03-12 03:21:22
【问题描述】:

我在脚本库上有常用的帮助器等方法,我想直接在 powershell 远程处理上使用它们,但我不知道如何将它们传递给针对其他机器的脚本。

我尝试将函数作为脚本块传递并在远程服务器上执行,在本地计算机上一切正常:

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

“write-host "abc" 一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。 + CategoryInfo:ObjectNotFound:(写主机“abc”:String)[],CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

知道有什么问题吗?

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

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

【问题讨论】:

标签: powershell powershell-remoting


【解决方案1】:

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

【讨论】:

  • 已编辑问题,这是我尽量避免的解决方案。
  • 回复:编辑 - 您必须让远程计算机“知道”您尝试执行的额外功能,方法是将它们包含在脚本块中或通过 import-module 导入它们。
【解决方案2】:

另一种选择是使用[ScrtiptBlock]::Create() 使用本地会话中已声明的函数定义来构建脚本。这使您不必手动重新创建远程脚本调用内函数中的所有代码:

function test { write-host "abc" }

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

$SB


function test { write-host "abc" }
test

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

编辑:

根据额外的 cmets,如果您在声明函数的远程计算机上有一个脚本文件库,您可以在脚本块中对它们进行点源:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多