我编写了一个脚本,用于在远程计算机中执行脚本。
脚本按以下方式组织在远程机器中,
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
答案 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,但在脚本执行后保持当前目录不变,这在某些情况下很重要。