在PowerShell中包含相关文件

我想用这样的伪句法来包含脚本文件:

Include '.\scripA.ps1' 

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

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

这是丑陋的。

有一些很好的方法来包含相对path的脚本?

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

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

 . "$PSScriptRoot\script.ps1" 

你可以点源(包括)文件:

。 \ scriptA.ps1

要获得脚本的完整path:

Resolve-Path。\ scriptA.ps1

如前所述,点源是最简单的select,虽然不是特别漂亮。 然而,这种格式使得它只是一点点清洁:

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

另外,关于相对path的说明对于明确说明是有用的:原始post可能似乎意味着需要相对于当前工作目录的path; 在现实中,其意图是相对于当前脚本的源代码目录 (如alex2k8自己的代码示例所示)。 因此,这允许当前脚本从同一个存储库访问其他脚本。

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

 . "RelativeOrAbsolutePathToFile\include.ps1" $result = FunctionInIncludeFile() 

参考:
如何在脚本中重用Windows PowerShellfunction

这可能会从任何目录工作,但它会是一个sloooooowwwwwfind如果你的起始目录不是你想要包括的文件的直接前面的目录。 IOW,如果您的search起点是c:\或其他驱动器盘符的根目录,则可能会非常慢。

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

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