獲取 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