【问题标题】:Import-module in remote machine远程机器中的导入模块
【发布时间】:2013-11-17 08:28:00
【问题描述】:

我编写了一个脚本,它将在远程机器上执行一个脚本。 脚本在远程机器中按以下方式组织,
lib - 这是库文件所在的位置
测试 - 这是测试脚本所在的位置

远程机器中的脚本(在测试文件夹中)从库文件夹中导入其他模块,如

导入模块-名称“..\lib\commonlib.psm1”。

现在调用测试文件夹远程机器中的脚本时,出现任何错误

Import-Module : 未加载指定的模块 '..\lib\commonlib.psm1' 因为在任何模块目录中都没有找到有效的模块文件(目录 lib 和 commonlib.psm1 存在于正确的路径中)

如何解决这个问题?

下面是在远程机器上运行脚本的命令。

$job = "c:\scripts\test.ps1" $cmdRes = Invoke-Command -ComputerName $remoteMachineName -ScriptBlock {& $args[0]} -ArgumentList $job -AsJob

【问题讨论】:

  • 如果模块路径指定为绝对路径,脚本是否有效?

标签: powershell powershell-2.0 powershell-3.0


【解决方案1】:

如果您可以依赖 v3,则使用 $PSScriptRoot 加载相对于脚本位置的模块,例如

Import-Module "$PSScriptRoot\..\lib\commonlib.psm1"

如果您需要在 V2 上工作,请执行以下操作:

$ScriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent
Import-Module "$scriptdir\..\lib\commonlib.psm1"

【讨论】:

    【解决方案2】:

    我在 PowerShell v2 中采用的另一种方法是在脚本中使用相对引用时使用 Push-Location 和 Pop-Location。这样,您可以在脚本中尽可能简单地引用所有内容,而不必担心上下文更改会导致问题。继续 Keith 的 v2 示例:

    Push-Location -Path $(Split-Path $MyInvocation.MyCommand.Path -Parent)
    Import-Module ..\lib\commonlib.psm1
    
    .\SomeOtherScript.ps1 $var # call to another script
    ... #rest of script
    Pop-Location
    

    不需要 Pop-Location,但在脚本执行后保持当前目录不变,这在某些情况下可能很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多