获取 PowerShell 脚本的当前位置

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 使用 Split-Path Cmdlet 获取 PowerShell 脚本的当前位置
  2. 使用 $PSScriptRoot 变量获取 PowerShell 脚本的当前位置
  3. 获取 Windows PowerShell 中的工作目录以获取 PowerShell 脚本的当前位置
获取 PowerShell 脚本的当前位置

每当我们需要引用一个公共模块或脚本时,我们都希望使用相对于当前脚本文件的路径。这样,脚本总是可以在库中找到其他脚本。

在本文中,我们将讨论获取正在运行的 PowerShell 脚本的当前位置的不同方法。

使用 Split-Path Cmdlet 获取 PowerShell 脚本的当前位置

在 PowerShell 3 之前,没有更好的方法可以使用 Split-Path cmdlet 查询 MyInvocation.MyCommand.Definition 属性。

Split-Path -Parent $($global:MyInvocation.MyCommand.Definition)

Split-Path cmdlet 与 -Parent 参数一起使用以返回正在运行的脚本的当前目录。

值得注意的是,只有在保存的 PowerShell (.ps1) 文件中包含上述语法时,这才有效。在命令行中运行上述语法将返回一个 Null 异常。

还值得注意的是,在 PowerShell 的集成脚本环境 (ISE) 中将上述语法作为选择运行(作为选择运行或按 F8)将触发 ParameterArgumentValidationErrorNullNotAllowed 或 Null 异常。

解决此问题的简单方法是调用 $psISE 变量并获取 CurrentFile.FullPath 属性,然后你可以从那里获取脚本的当前位置。请记住,在 PowerShell ISE 中进行测试时最好使用此语法。

Split-Path $psISE.CurrentFile.FullPath

使用 $PSScriptRoot 变量获取 PowerShell 脚本的当前位置

如果你运行的是 PowerShell 版本 3 或更高版本,则引入了一个自动变量来存储当前文件或模块的目录。

$PSScriptRoot 变量返回运行脚本的目录值。

$PSScriptRoot

获取 Windows PowerShell 中的工作目录以获取 PowerShell 脚本的当前位置

既然我们已经讨论了如何获取脚本的当前位置,那么学习获取脚本的当前工作目录并没有什么坏处。

在 Windows PowerShell v2 中,$ExecutionContext 变量包含 EngineIntrinsics 属性。你可以使用此变量和属性来查找可用于 cmdlet 的执行对象,包括正在运行的 Windows PowerShell 脚本的当前工作目录。

$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('.\')

但是,如果你运行的是最新版本的 Windows PowerShell,则引入了一个单独的 cmdlet 以方便操作。我们可以使用 Get-Location cmdlet 并调用 Path 属性来获取脚本的当前工作目录。

(Get-Location).Path
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn