远程机器中的导入模块

时间:2013-11-06 07:30:59

标签: powershell powershell-v2.0 powershell-v3.0

我编写了一个脚本,用于在远程计算机中执行脚本。 脚本按以下方式组织在远程机器中,
lib - 这是库filea所在的位置 测试 - 这是测试脚本所在的位置

远程计算机中的脚本(在tests文件夹中)从库文件夹中导入其他模块,如

Import-Module -Name“.. \ lib \ commonlib.psm1”。

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

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

如何解决此问题?

以下是在远程计算机中运行脚本的命令。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

我在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,但在脚本执行后保持当前目录不变,这在某些情况下很重要。