如何正确设置执行子PowerShell脚本的路径?

时间:2013-09-03 18:21:25

标签: c# powershell

已解决:以下解决方案是使用以下Join-Path: [System.Reflection.Assembly]::LoadFrom((Join-Path (pwd) "MyAssembly.dll")) | out-null

原始问题

我有PowerShell脚本和一个汇编文件,如下所示:

D:\path1\script1.ps1
D:\path2\script2.ps1
D:\path2\MyAssembly.dll

在D:\ path1 \ script1.ps1中我需要调用D:\ path2 \ script2.ps1。然后,script2.ps1将依次加载已放置在D:\ path2文件夹中的一些C#程序集。我的印象是,如果我执行Set-Location或Push-Location,那么工作目录将适用于script2.ps1中发生的任何事情。

script1.ps1如下所示:

$otherpath = "D:\path2"

Set-Location -Path $otherpath

Push-Location -Path $otherpath

.\script2.ps1

script2.ps1如下所示:

[System.Reflection.Assembly]::LoadFrom("MyAssembly.dll") | out-null

但是,当我在D:\ path1时,我按如下方式执行script1.ps1,然后我得到一个FileNotFound异常:

D:\path1>powershell .\script1.ps1

Exception calling "LoadFrom" with "1" argument(s): "Could not load file or assembly
'file:///D:\path1\MyAssembly.dll' or one of its dependencies. The system cannot find the file
specified."
At D:\path2\script2.ps1:1 char:1
+ [System.Reflection.Assembly]::LoadFrom("MyAssembly.dll") | out-null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FileNotFoundException

如何正确设置路径,以便当我从D:\ path1调用script1.ps1时,环境将D:\ path2正确设置为D:\ path2中所有组件调用的工作目录?< / p>

2 个答案:

答案 0 :(得分:0)

只要script2中的工作目录没有变化,使用[System.Reflection.Assembly]::LoadFrom((Join-Path (pwd) "MyAssembly.dll")) | out-null就可以了。

另一种方法是使用$MyInvocation.MyCommand.Path,它将始终提供当前脚本的完整路径。您可以像这样使用它:

[System.Reflection.Assembly]::LoadFrom((Join-Path (Split-Path $MyInvocation.MyCommand.Path) "MyAssembly.dll")) | out-null

答案 1 :(得分:0)

使用以下Join-Path:

[System.Reflection.Assembly]::LoadFrom((Join-Path (pwd) "MyAssembly.dll")) | out-null