如何使用 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 命令还具有一个名为 -Credential 的参数,据说可以接受一个凭据 PSCredential 对象。但根据微软的说法,此参数不受任何内置的 PowerShell 提供程序 支持,并且在使用时会引发错误。

以下参数称为 拆分位置参数。这些参数告诉 PowerShell Split-Path 命令应返回路径的哪个元素或部分。由于该命令只能返回路径的一个元素,因此一次只能使用其中一个参数。

  • -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

获取路径的驱动器或限定符

有时您可能需要仅返回限定符或驱动器号。例如,当您希望您的脚本根据驱动器号汇总结果时。

要执行此操作,请使用 -Qualifier 参数运行以下 PowerShell Split-Path 命令。该命令会拆分路径并仅返回限定符字符串。

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-Path 命令的替代品——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命令是系统管理员和用户不可或缺的工具。本教程旨在教会您如何使用Split-Path命令来分割任何给定路径,并根据您使用的参数返回特定元素。

您以前在任务中使用过Split-Path吗?如果没有,本教程是否说服您在手动或自动化作业中使用它?或者您知道比PowerShell的Split-Path更好的拆分路径的另一种方法吗?

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