【问题标题】:Run a local function on a remote computer?在远程计算机上运行本地功能?
【发布时间】:2018-01-05 22:24:51
【问题描述】:

我的电脑上有一个简单的功能

MYPC> $txt = "Testy McTesterson"
MYPC> function Do-Stuff($file) { 
  cd c:\temp; 
  $txt > $file; 
}

我想在远程计算机上运行它

MYPC> Invoke-Command -ComputerName OTHERPC { Do-Stuff "test.txt" }

可以理解,Do-Stuff 在 OTHERPC 上不存在,这不起作用。我怎样才能让它工作呢? Do-Stuff 函数抽象了一些基本代码并在其他几个地方调用,所以我不想重复它。

请注意,在我的示例中,值是通过参数和范围闭包传递给函数的。这可能吗?

【问题讨论】:

    标签: powershell powershell-remoting


    【解决方案1】:

    我不知道你如何使用闭包值,但你可以像这样将两者都作为参数传递:

    $txt = "Testy McTesterson"
    $file = "SomeFile.txt"
    function Do-Stuff { param($txt,$file) cd c:\temp; $txt > $file }
    Invoke-Command -ComputerName SomeComputer -ScriptBlock ${function:Do-Stuff} -ArgumentList $txt, $file
    

    【讨论】:

    • 如果函数是在父脚本范围内定义的,这似乎可以工作。但是,如果您的函数位于本地加载的模块中,则它似乎不起作用。到目前为止,我还没有找到远程运行本地模块中定义的函数的解决方案(远程计算机上没有该模块)。
    • 为了澄清我上面的评论,我发现了以下内容:如果函数是在本地模块中定义的,并且它是由 $PSModulePath 中存在的位置自动加载的,则函数不能传递给远程计算机。但是,如果在父脚本中显式加载本地模块,则可以将函数传递给远程计算机。
    【解决方案2】:

    不确定是否还有人关心,但您实际上可以通过 PSSession 将保存在 .ps1 文件中的自定义函数加载到远程计算机。我试过了,它对我有用。 Check out this guy's solution

    【讨论】:

    • 链接往往会发生变化或丢失,您能否解释一些内容或在此处引用它?
    • 嘿,对于迟到的回复真的非常抱歉。工作和生活优先。无论如何,您可以尝试像我所做的那样Invoke-Command -Session $myPSSession -FilePath "C:\dir\customFunctionFile.ps1" 只要 PSSession 是打开的,您应该可以使用您在加载的文件中定义的任何函数。完成后不要忘记删除会话,并且作为旁注,删除会话时加载的文件确实会被卸载。 LMK,如果您需要任何进一步的帮助,但这应该绰绰有余......阿罗哈!
    【解决方案3】:

    有人真正关心的风险更小:),但这是一种方法。

    MYPC> $myPCscript = @'
    $txt = "Testy McTesterson"
    function Do-Stuff($file) { 
        cd c:\temp
        $txt > $file
    }
    '@
    MYPC> Invoke-Command -ComputerName OTHERPC { Invoke-Expression $using:myPCscript; Do-Stuff "test.txt" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 2017-01-24
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多