我想包含具有这种伪语法的脚本文件:
Include '.\scripA.ps1'
但我发现的唯一东西是这样的:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那是丑陋的。
有没有一些很好的方法来包含具有相对路径的脚本?
我想包含具有这种伪语法的脚本文件:
Include '.\scripA.ps1'
但我发现的唯一东西是这样的:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
那是丑陋的。
有没有一些很好的方法来包含具有相对路径的脚本?
您可以像这样使用 $PSScriptRoot 参数:
. "$PSScriptRoot\script.ps1"
您可以点源(包含)该文件:
. .\scriptA.ps1
要获取脚本的完整路径:
解析路径 .\scriptA.ps1
如前所述,点源是最简单的选择,尽管不是特别漂亮。但是,这种格式使它更清晰一点:
$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)
另外,关于相对路径的注释有助于明确说明:原始帖子似乎暗示想要相对于当前工作目录的路径;实际上,其目的是相对于当前脚本的源目录(如 alex2k8 自己的代码示例所示)。因此,这允许当前脚本访问来自同一存储库的其他脚本。
不幸的是,没有,没有好的方法。PowerShell 在 V1 中并没有真正很好地支持这个想法。确实,您正在采取的方法是最好的方法
从 V2 开始(本机从 Win7/2008R2 开始;请参阅$psversiontable.psversion
),您可以轻松地包含如下文件:
. "RelativeOrAbsolutePathToFile\include.ps1"
$result = FunctionInIncludeFile()
您可以使用 $PSScriptRoot 和“Split-Path”指令使其干净地用于相对路径。
. (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')
这可能适用于任何目录,但如果您的起始目录不是您尝试包含的文件的直接先前目录,它将是一个 slooooooowwwww 查找。IOW,如果您的搜索起点是 c:\ 或其他驱动器号的根目录,那么这可能会非常慢。
. $(Resolve-Path -literal $(gci -Recurse include.ps1))
如果您在 PC 上开发脚本但需要将它们部署到将脚本作为计划任务运行的服务器,这将特别有效。