我想包含具有这种伪语法的脚本文件:
Include '.\scripA.ps1'
但我发现的唯一的事情就是这样:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那是丑陋的。
是否有一些漂亮的方法来包含具有相对路径的脚本?
答案 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()
答案 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')