在PowerShell中包含相关文件

ale*_*2k8 54 powershell relative-path include

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

Include '.\scripA.ps1'
Run Code Online (Sandbox Code Playgroud)

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

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
Run Code Online (Sandbox Code Playgroud)

那很难看.

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

chr*_*chu 103

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

. "$PSScriptRoot\script.ps1"
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一有效的答案 (6认同)
  • 我发现这对于 Azure ARM 模板 VM CustomScriptExtension 非常有用,我在其中使用 FileUris 参数从存储帐户 Blob 容器下载多个文件,然后调用引用其他文件的一个文件。Azure 文档对于如何确定下载文件的相对路径没有太大帮助。我正在尝试`。.\path\to\script.ps1` 当您从同一文件夹中的 Windows 资源管理器或 PS 终端运行脚本时,它可以工作,但在部署到 Azure 时始终失败。这个答案完全解决了这个问题。 (2认同)

Sha*_*evy 29

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

.\ scriptA.ps1

要获取脚本的完整路径:

Resolve-Path.\ scriptA.ps1


Mic*_*ens 20

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

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)
Run Code Online (Sandbox Code Playgroud)

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


Jar*_*Par 10

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

  • 在PowerShell 3.0中,您可以使用`.(Join-Path $ PSScriptRoot settings.ps1)`(以点开头的命令). (2认同)

Ral*_*oss 6

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

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()
Run Code Online (Sandbox Code Playgroud)

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

  • 据我所知,这个问题是点源线是相对于当前工作目录而不是相对于包含点源线的脚本进行评估的.因此,如果您首先对包含该脚本的目录执行"cd",那么如果您从另一个目录调用它,则不会. (7认同)