61

我想包含具有这种伪语法的脚本文件:

Include '.\scripA.ps1'

但我发现的唯一东西是这样的:

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')

那是丑陋的。

有没有一些很好的方法来包含具有相对路径的脚本?

4

7 回答 7

124

您可以像这样使用 $PSScriptRoot 参数:

. "$PSScriptRoot\script.ps1"
于 2013-11-26T11:42:31.587 回答
29

您可以点源(包含)该文件:

. .\scriptA.ps1

要获取脚本的完整路径:

解析路径 .\scriptA.ps1

于 2009-03-26T09:45:40.957 回答
21

如前所述,点源是最简单的选择,尽管不是特别漂亮。但是,这种格式使它更清晰一点:

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)

另外,关于相对路径的注释有助于明确说明:原始帖子似乎暗示想要相对于当前工作目录的路径;实际上,其目的是相对于当前脚本的源目录(如 alex2k8 自己的代码示例所示)。因此,这允许当前脚本访问来自同一存储库的其他脚本。

于 2011-06-02T17:19:45.217 回答
8

不幸的是,没有,没有好的方法。PowerShell 在 V1 中并没有真正很好地支持这个想法。确实,您正在采取的方法是最好的方法

于 2009-03-26T01:44:05.183 回答
6

从 V2 开始(本机从 Win7/2008R2 开始;请参阅$psversiontable.psversion),您可以轻松地包含如下文件:

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

参考:
如何在脚本中复用windows powershell函数

于 2013-03-22T09:05:08.947 回答
2

您可以使用 $PSScriptRoot 和“Split-Path”指令使其干净地用于相对路径。 . (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')

于 2019-08-14T17:51:59.873 回答
0

这可能适用于任何目录,但如果您的起始目录不是您尝试包含的文件的直接先前目录,它将是一个 slooooooowwwww 查找。IOW,如果您的搜索起点是 c:\ 或其他驱动器号的根目录,那么这可能会非常慢。

. $(Resolve-Path -literal $(gci -Recurse include.ps1))

如果您在 PC 上开发脚本但需要将它们部署到将脚本作为计划任务运行的服务器,这将特别有效。

于 2017-11-18T15:09:23.270 回答