如何使用 PowerShell Split-Path Cmdlet 拆分路徑

您需要拆分路径以获取特定部分吗?如果是的话,那么PowerShell的Split-Path命令是一个可靠的朋友。当您处理文件、证书和注册表时,您会注意到路径代表它们的位置。

在某些时候,您可能需要过滤要返回的路径的哪个部分,也许是在进行自动化时。幸运的是,本教程将教您如何使用PowerShell的Split-Path命令来实现这一点。

继续阅读,让我们为您的PowerShell工具库增添一件新武器!

前提条件

如果您计划按照本实践教程中的示例操作,您需要一台运行任何现代版本的Windows的计算机,并且安装有PowerShell 5.1或更高版本。本教程将使用安装有PowerShell 7.1.1的Windows 10 20H2。

路径的组成部分

在深入使用PowerShell的Split-Path命令之前,让我们确保您清楚路径是什么。路径确定了按照特定格式的项的位置。

例如,文件的路径可以是C:\demo\subfolder1\TestFile_11.txt。如果您将此路径拆分为部分,路径包括以下内容:

  • C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (:) character.
  • \demo\subfolder1\是文件夹和子文件夹或容器。
  • TestFile_11.txt是文件名或叶子。叶子是路径的最后一个元素或部分。

記住,路徑不僅限於文件和文件夾。其他有效的路徑可能包括:

  • 憑證(例如,Cert:\CurrentUser\My
  • 註冊表(例如,HKCU:\Software
  • 函數(例如,Function:\New-Guid
  • 變量(例如,Variable:\PSEdition
  • 活動目錄(例如,AD:\CN=Users,DC=Constoso,DC=com

PowerShell Split-Path 參數

像任何 cmdlet 一樣,Split-Path 附帶一組參數,用於操作 cmdlet 的行為並返回其輸出。這些參數構成了 PowerShell Split-Path 語法。

  • -Path – 這個參數接受一個或多個要拆分的路徑字符串。此參數還接受管道輸入。路徑中的通配符也是可以接受的。
  • -LiteralPath – 與 -Path 參數類似,-LiteralPath 參數也接受要拆分的路徑。但是,此參數將僅將路徑視為其書寫方式。也就是說,如果使用此參數指定路徑,則命令將不會解釋通配符。
  • -Resolve – 此參數告訴 Split-Path cmdlet 解析由您提供的路徑引用的文件或項目。由於其文字性質,您無法與 -LiteralPath 參數一起使用此參數。
  • -IsAbsolute – 此參數返回一個布爾值,用於確定您指定的路徑是否為絕對路徑。

PowerShell Split-Path cmdlet 還有一個名為 -Credential 的參數,據稱接受一個認證 PSCredential 物件。但根據 Microsoft,此參數不受任何內置的 PowerShell 提供者 支援,並且在使用時會引發錯誤。

以下參數被稱為 拆分位置參數。這些參數告訴 PowerShell Split-Path cmdlet 應返回路徑的哪個元素或部分。由於 cmdlet 只能返回路徑的一個元素,因此您一次只能使用其中一個參數。

  • -Parent – 返回指定路徑的父位置(不包括項目或文件名)。此參數也是默認的拆分位置參數,這意味著您可以省略此參數,仍然可以得到父位置作為結果。
  • -Leaf – 僅返回路徑的最後一個元素或葉子。
  • -LeafBase – 僅返回路徑的最後一個元素或葉子,不包括擴展名。此參數僅適用於 PowerShell 6.0 及以上版本。
  • -Extension -僅返回路徑的擴展名(從最後一個點“.”到路徑的最後一個字符)。此參數僅在PowerShell 6.0及以上版本中可用。
  • -Qualifier –僅返回路徑的驅動器或限定符。
  • -NoQualifier –從路徑的其余部分中刪除驅動器或限定符。

使用PowerShell Split-Path Cmdlet(示例)

PowerShell Split-Path cmdlet允許您分割並解析路徑的各個部分。在此之后,您可以指定要返回路徑的哪一部分。根據輸出要求,您可以選擇返回限定符、不帶限定符的路徑以及文件名。

獲取路徑的上級文件夾

要返回路徑的上級文件夾,運行PowerShell Split-Path cmdlet並附加-Parent參數。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

下面的結果顯示命令返回上級文件夾的路徑。

Returning the parent containers of the Item

提示:運行PowerShell Split-Path cmdlet而不使用參數將默認返回上級文件夾,與使用-Parent參數的行為相同。

提示:-Path參數接受多個路徑,這使您可以在單個命令中拆分多個路徑字符串值。

e.g., Split-Path -Path 'c:\folder1','c:\folder2'

顯示不帶限定符的路徑

想像一下,你正在創建一個腳本,用於將一個驅動器的文件夾樹結構複製到另一個驅動器(例如,C:\demo\subfolder1D:\demo\subfolder1)。您可能希望您的代碼僅拆分源路徑並獲取僅包含文件夾結構而不包含驅動器字母的部分。

要獲取沒有限定符的路徑,運行 PowerShell Split-Path 命令,並使用 -NoQualifier 參數,就像下面的命令一樣。此命令將拆分路徑並省略結果中的驅動器字母。

Split-Path -Path C:\demo\subfolder1 -NoQualifier

從下面的結果中可以看出,使用 noQualifier 參數返回的路徑不包含限定符字符串。

Returning the Path Without the Qualifier

獲取路徑的驅動器或限定符

有時您可能需要僅返回限定符或驅動器字母。例如,當您希望腳本根據驅動器字母對結果進行總結時。

為此,運行以下 PowerShell Split-Path 命令,並使用 -Qualifier 參數。此命令將拆分路徑並僅返回限定符字符串作為結果。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

顯示文件、目錄或項目的名稱

將路徑想象成一棵樹。限定符就是樹本身,文件夾是樹枝,最後,您會找到葉子。葉子是路徑末尾的任何非零長度字符串。

當您需要拆分路徑以獲取葉子時,運行下面的 Split-Path 命令,並附加 -Leaf 參數。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

結果,下面的圖像顯示,該命令僅返回了您指定的路徑中的文件名。

Returning the Path’s Leaf

將檔案名稱和擴展名分離(適用於PowerShell 6.0及以上版本)

注意:本節適用於PowerShell 6.0及以上版本。

因此,你已經分離了路徑並返回了項目。在這個案例中,項目是一個檔案名稱(TestFile_11.txt),它由兩部分組成——基本名和擴展名。PowerShell的Split-Path命令允許你進一步將葉子分割成這兩部分,使用-LeafBase-Extension參數。

要獲取檔案名的基本名和擴展名,請運行以下命令。

如果路徑沒有擴展名,Extension參數將返回一個空字符串。

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and Extension

將檔案名稱和擴展名分離(適用於Windows PowerShell 5.1及以下版本)

不幸的是,在Windows PowerShell 5.1及更低版本中,-LeafBase-Extension參數不可用。但不用擔心,通過一些PowerShell魔法,即使你只有Windows PowerShell 5.1,你也可以復制這些參數的輸出。

但是,你將使用下一個最佳選擇——split()方法-replace運算符的組合。

A PowerShell string object, such as the path, contains a split() method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\) back-slash character.

另一方面,-replace 運算子允許您使用正則表達式 (RegEx)替換字符串。

為了模擬 -LeafBase 參數的結果,在 PowerShell 中運行以下命令。

# 使用 '\' 作為分隔符號,拆分路徑 ('C:\demo\subfolder1\TestFile_11.txt')
# 在拆分後選擇最後一個 '[-1]' 元素 (TestFile_11.txt)
# 搜索與此模式匹配的字符串 --> '\.[^.]*$'
# ^ 此模式將匹配路徑中的最後一個點 "." 以及其後的所有其他字符。
# 然後將匹配的部分替換為空值 ''。
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

因此,下面的截圖顯示該命令僅返回了文件名的基本名稱。

Getting the file base in PowerShell 5.1

現在,要僅獲取文件擴展名,請在 PowerShell 中運行以下命令。

# 使用 '.' 作為分隔符號,拆分路徑 ('C:\demo\subfolder1\TestFile_11.txt')
# 在拆分後選擇最後一個 '[-1]' 元素 (txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

下面的結果顯示該命令僅返回了文件名擴展名 – txt

Getting the file extension in PowerShell ≤ 5.1

確定路徑是否為絕對路徑

作為系統管理員,您將遇到兩種路徑類型—絕對相對。但是它們有什麼區別?絕對路徑以限定符開頭,例如 C:\demoHKCU:\Software。相反,相對路徑沒有限定符,如 .\demo\folder1\folder2

PowerShell 的 Split-Path 命令可使用 -IsAbsolute 參數來幫助您識別絕對路徑。要這樣做,請運行以下命令以確定路徑是否為絕對路徑。

# 這是絕對路徑
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# 這是相對路徑
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

正如您在下面看到的,-isAbsolute 參數將返回一個布林值,指示路徑是否為絕對 (TRUE) 或相對 (FALSE)。

Determining if the Path is Absolute

使用通配符拆分和解析路徑

到目前為止,您使用 Split-Path 命令拆分的路徑不必存在。無論路徑是否存在,此命令都將拆分它並給出結果。

但是 PowerShell 的 Split-Path 命令還有另一個參數叫做 -Resolve。此參數允許您解析通配符引用的項目。如果您使用此參數,則您將拆分的路徑和其中的項目必須已經存在。

例如,要返回與 *.txt 文件擴展名匹配的項目,請運行以下命令。-Leaf 參數確保命令僅返回項目而不返回父容器。

(*) 通配符表示要匹配的一個或多個字符,而 (?) 表示要匹配的單個字符通配符。

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

下面的結果列出了文件 TestFile_11.txtTestFile_20.txt。這些文件都匹配了 .txt 檔案擴展名。

Resolving matching filenames

為了解決單個字符匹配,請將星號(*)通配符替換為問號(?)通配符,如下所示的命令。

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

下面的輸出僅顯示文件TestFile_20.txt,因為這個文件是唯一匹配的文件。

Resolving matching single character

如果路徑包含轉義字符,例如重音符號(“`”),請將路徑用單引號括起來解析路徑。例如,下面的命令將分割並解析包含轉義字符的路徑。

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

作為概念證明,如果不用單引號括起來,該路徑不存在的錯誤將返回。如果使用雙引號而不是單引號,也會出現同樣的錯誤。

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

結論

PowerShell的Split-Path cmdlet是系統管理員和用戶不可或缺的工具。本教程旨在教你如何使用Split-Path cmdlet分割任何給定的路徑並根據使用的參數返回特定元素。

您以前在任務中使用過Split-Path嗎?如果沒有,這篇教程能說服您在手動或自動化工作中使用它嗎?或者您是否知道比PowerShell的Split-Path更好的路徑分割方法?

Source:
https://adamtheautomator.com/powershell-split-path/