在PowerShell中包含相关文件

时间:2009-03-26 01:42:45

标签: powershell include relative-path

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

Include '.\scripA.ps1'

但我发现的唯一的事情就是这样:

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那是丑陋的。

是否有一些漂亮的方法来包含具有相对路径的脚本?

7 个答案:

答案 0 :(得分:96)

您可以使用$ PSScriptRoot参数,如下所示:

. "$PSScriptRoot\script.ps1"

答案 1 :(得分:29)

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

。 \ scriptA.ps1

获取脚本的完整路径:

Resolve-Path。\ scriptA.ps1

答案 2 :(得分:20)

Dot-sourcing是最简单的选择,尽管不是特别漂亮,如前所述。但是,这种格式使它只是一点点清洁:

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

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

答案 3 :(得分:11)

不幸的是,没有好办法。 PowerShell在V1中完全不支持这个想法。你真正采取的方法是最好的方法

答案 4 :(得分:6)

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

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

参考:
How to reuse windows powershell functions in scripts

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

您可以使用$ PSScriptRoot和“ Split-Path”指令使其在相对路径下正常工作。 . (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')