0

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

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

导入模块-名称“..\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

4

2 回答 2

1

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

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

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

$ScriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent
Import-Module "$scriptdir\..\lib\commonlib.psm1"
于 2013-11-06T14:16:40.277 回答
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,但在脚本执行后保持当前目录不变,这在某些情况下可能很重要。

于 2013-11-06T16:07:14.300 回答