点源文件并不起作用

时间:2015-11-01 15:15:42

标签: powershell

我跟着this提问,但我似乎无法解决这个问题。

(为了测试)我有一个带有2个脚本的powershell模块:variables.ps1和function.ps1以及一个清单mymodule.psd1(这些文件都在同一个目录中)

这是variables.ps1的内容:

$a = 1;
$b = 2;

这是function.ps1的内容

. .\variables.ps1
function myfunction
{
    write-host $a
    write-host $b
}

导入模块并调用myfunction时。这是输出:

C:\> Import-Module .\mymodule.psd1
C:\> myfunction
. : The term '.\variables.ps1' is not recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\Jake\mymodule\function.ps.ps1:8 char:4
+     . .\variables.ps1
+       ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\variables.ps1:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : CommandNotFoundException

为什么这不起作用?

1 个答案:

答案 0 :(得分:14)

在脚本中使用相对路径时,它们与调用者$PWD相关 - 您当前所在的目录。

要使其相对于当前脚本在文件系统上的目录,您可以使用自动变量$PSScriptRoot

. (Join-Path $PSScriptRoot variables.ps1)

PowerShell 3.0版中引入了$PSScriptRoot变量,对于PowerShell 2.0,您可以使用以下函数进行模拟:

if(-not (Get-Variable -Name 'PSScriptRoot' -Scope 'Script')) {
    $Script:PSScriptRoot = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
}
. (Join-Path $PSScriptRoot variables.ps1)