如何獲取 PowerShell 腳本的當前位置

  1. 使用 Split-Path Cmdlet 獲取 PowerShell 腳本的當前位置
  2. 使用 $PSScriptRoot 變量獲取 PowerShell 腳本的當前位置
  3. 獲取 Windows PowerShell 中的工作目錄以獲取 PowerShell 腳本的當前位置
  4. 結論
如何獲取 PowerShell 腳本的當前位置

在這本綜合指南中,我們深入探討各種方法來確定 PowerShell 腳本的當前位置,這是一個增強腳本可移植性和可靠性的基本方面。所討論的每種方法都針對不同版本的 PowerShell 和腳本場景,確保廣泛的適用性。

我們首先介紹 Split-Path cmdlet,這是早期 PowerShell 版本的一種多功能方法,然後過渡到 PowerShell 3 及更高版本中 $PSScriptRoot 的便利性。此外,我們還探索了強大的 $ExecutionContext 方法和簡單的 Get-Location cmdlet,以滿足不同環境和需求。

最後,我們用熟悉的 pwd 別名簡化了過程,展示了 PowerShell 的適應性。

使用 Split-Path Cmdlet 獲取 PowerShell 腳本的當前位置

在 PowerShell 3 之前,沒有更好的方法通過使用 Split-Path cmdlet 查詢 MyInvocation.MyCommand.Definition 屬性。

使用 Split-Path$global:MyInvocation 的主要目的是提取當前執行的 PowerShell 腳本的目錄路徑。當腳本需要與與腳本位於同一位置的其他文件或目錄互動,或者當腳本的行為依賴於其位置時,這特別有用。

$scriptDirectory = Split-Path -Parent $MyInvocation.MyCommand.Definition
Write-Host "Current script location: $scriptDirectory"

在這個示例中,我們使用 Split-Path-Parent 參數來隔離運行腳本的完整路徑中的目錄組件。該路徑來自 $MyInvocation.MyCommand.Definition

結果目錄路徑存儲在變量 $scriptDirectory 中。

最後,我們使用 Write-Host 輸出這個目錄路徑,提供腳本當前位置的清晰和即時視圖。這種方法不僅高效,還確保了不同版本的 PowerShell 之間的兼容性。

輸出:

獲取 PowerShell 腳本的當前位置 - 輸出 1

值得注意的是,這僅在您將上述語法包含在已保存的 PowerShell (.ps1) 文件中時才會正常工作。直接在命令行運行上述語法將返回 Null 例外。

還值得注意的是,在 PowerShell 的集成腳本環境 (ISE) 中將上述語法作為選擇 (作為選擇運行或按 F8) 將觸發 ParameterArgumentValidationErrorNullNotAllowed 或 Null 例外。

解決此問題的一個簡單方法是調用 $psISE 變量並獲取 CurrentFile.FullPath 屬性,從而可以獲得腳本的當前位置。

使用 $PSScriptRoot 變量獲取 PowerShell 腳本的當前位置

如果您運行的是 PowerShell 版本 3 或更高版本,則引入了一個自動變量來存儲當前文件或模塊的目錄。

$PSScriptRoot 變量保存當前執行的腳本的目錄路徑。這種自動變量對於創建可移植的腳本非常有用,因為硬編碼路徑並不實際。

當您的腳本需要加載與腳本本身位於同一目錄的文件或模塊時,它尤其方便。

Write-Host "The current script is located in: $PSScriptRoot"

在我們的腳本中,我們使用 Write-Host cmdlet 來打印 $PSScriptRoot 的值。這個變量自動包含腳本所在目錄的完整路徑。

通過調用 Write-Host,我們確保該路徑在 PowerShell 控制台中顯示。這種方法既簡單又有效,使腳本在各種環境和場景中都很通用。

輸出:

獲取 PowerShell 腳本的當前位置 - 輸出 2

獲取 Windows PowerShell 中的工作目錄以獲取 PowerShell 腳本的當前位置

現在我們已經討論了如何獲取腳本的當前位置,學習如何獲取我們腳本的當前工作目錄也不會有害。

在 Windows PowerShell v2 中,$ExecutionContext 變量包含 EngineIntrinsics 屬性。您可以使用這個變量和屬性來查找可供 cmdlet 使用的執行對象,包括正在運行的 Windows PowerShell 腳本的當前工作目錄。

$currentScriptLocation = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('.\')
Write-Host "Current script location: $currentScriptLocation"

在這個示例中,我們利用 $ExecutionContext 獲取當前腳本的位置。通過調用 GetUnresolvedProviderPathFromPSPath 方法,參數為 '.\',我們有效地請求 PowerShell 將當前目錄(由 '.\' 表示)轉換為完整路徑。

結果存儲在變量 $currentScriptLocation 中,然後我們使用 Write-Host 顯示它。這種方法特別穩健,因為它不依賴於腳本以特定方式運行,並且在不同版本的 PowerShell 中均可工作。

輸出:

取得 PowerShell 腳本的當前位置 - 輸出 3

不過,如果您運行的是最新版本的 Windows PowerShell,則引入了一個獨立的 cmdlet 以方便使用。我們可以使用 Get-Location cmdlet,並調用 Path 屬性來獲取腳本的當前工作目錄。

$currentDirectory = (Get-Location).Path
Write-Host "Current directory: $currentDirectory"

在提供的代碼中,我們首先使用 Get-Location cmdlet 獲取當前位置對象。然後,我們訪問其 Path 屬性以字符串形式獲取當前目錄,並將其存儲在 $currentDirectory 變量中。

最後,我們使用 Write-Host 顯示這個信息。這種方法對於需要了解其執行上下文以目錄位置的腳本來說是非常有效的。

輸出:

獲取 PowerShell 腳本的當前位置 - 輸出 4

在 PowerShell 中,pwdGet-Location cmdlet 的別名。Get-Location cmdlet 獲取 PowerShell 會話的當前工作目錄,這正是傳統的 pwd(打印工作目錄)命令在 Unix 類系統中的功能。

考慮到 PowerShell 的靈活性和兼容性,提供這些別名以使用戶更容易將其他 shell 環境(如 Unix 或 Linux)中的相似命令應用於 PowerShell 中。

$currentDirectory = pwd
Write-Host "Current directory: $currentDirectory"

在這個示例中,我們使用 pwd 命令獲取當前位置對象,然後將其存儲在 $currentDirectory 變量中。利用 Write-Host,我們將當前目錄的路徑輸出到控制台。

這種方法顯著簡單,且不需要任何複雜的語法或額外的參數。這是一個快速且可靠的方式來確定腳本運行所在的目錄。

輸出:

獲取 PowerShell 腳本的當前位置 - 輸出 5

結論

本文提供了對於不同方法的徹底探索,以確定 PowerShell 腳本的當前位置,每種方法都適應了不同的 PowerShell 版本和腳本上下文。從適用於早期版本的 Split-Path cmdlet 到在後期版本中自動引入的 $PSScriptRoot 變量,本指南確保對於廣泛的 PowerShell 用戶具有相關性。

此外,使用 $ExecutionContextGet-Location cmdlet 分別提供了穩健和簡單的替代方案,而 pwd 別名則為不同腳本背景的用戶提供了一個熟悉的選項。這本綜合指南不僅增強了腳本的可移植性和可靠性,還突顯了 PowerShell 的多樣性。

配備這些技術,腳本編寫者和系統管理員能更好地處理文件路徑依賴性,使其腳本在各種環境中更具適應性和有效性。最終,理解這些方法是掌握 PowerShell 腳本和優化腳本在不同平台和場景中功能的基礎。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
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