你需要拆分路径以获取其中特定部分吗?如果是的话,那么 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
参数。
下面的结果显示该命令返回父文件夹的路径。

提示:运行PowerShell Split-Path cmdlet无参数将默认返回父文件夹,与使用
-Parent
参数的行为相同。
提示:
-Path
参数接受多个路径,允许您在单个命令中拆分多个路径字符串值。e.g.,
Split-Path -Path 'c:\folder1','c:\folder2'
显示不带限定符的路径
想象一下,您正在创建一个脚本,用于将一个驱动器中的文件夹树结构复制到另一个驱动器中(例如,C:\demo\subfolder1 到 D:\demo\subfolder1)。您可能希望您的代码能够拆分源路径并仅获取文件夹结构,而不包括驱动器号。
要获取不带限定符的路径,请运行 PowerShell 的 Split-Path
命令,使用 -NoQualifier
参数,就像下面的命令一样。该命令会在拆分路径的同时省略驱动器号。
从下面的结果中可以看出,使用 noQualifier
参数返回的路径不包含限定符字符串。

获取路径的驱动器或限定符
有时您可能需要仅返回限定符或驱动器号。例如,当您希望您的脚本根据驱动器号汇总结果时。
要执行此操作,请使用 -Qualifier
参数运行以下 PowerShell Split-Path
命令。该命令会拆分路径并仅返回限定符字符串。

显示文件、目录或项的名称
将路径视为一棵树。限定符就像是树本身,文件夹是树枝,最后您会找到叶子。叶子是路径末尾的任何非零长度字符串。
当您需要拆分路径以获取叶子时,请运行下面的 Split-Path
命令,并附加 -Leaf
参数。
结果如下图所示,命令仅返回了您指定路径中的文件名。

拆分文件名和扩展名(≥PowerShell 6.0)
注意:此部分适用于PowerShell 6.0及以上版本。
您已将路径拆分并返回了项。而在这种情况下,该项是一个文件名(TestFile_11.txt),它有两个部分——基本部分和扩展名。PowerShell Split-Path
命令允许您使用 -LeafBase
和 -Extension
参数进一步将叶子拆分为这两个部分。
要获取文件名的基本部分和扩展名,请运行以下命令。
如果路径没有扩展名,则
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 中运行以下命令。
结果如下截图所示,该命令仅返回文件名的基本名称。

现在,要仅获取文件扩展名,请在 PowerShell 中运行以下命令。
以下结果显示,该命令仅返回文件扩展名 – txt
。

确定路径是否为绝对路径
作为系统管理员,您会遇到两种路径类型—绝对 和 相对。但它们有何区别?绝对路径以限定词开头,如 C:\demo 或 HKCU:\Software。相反,相对路径没有限定词,如 .\demo 或 \folder1\folder2。
PowerShell Split-Path
命令可以帮助您使用 -IsAbsolute
参数识别绝对路径。要执行此操作,请运行下面的命令以确定路径是否为绝对路径。
如下所示,-isAbsolute
参数返回一个布尔值,指示路径是绝对的(TRUE
)还是相对的(FALSE
)。

使用通配符拆分和解析路径
到目前为止,使用 Split-Path
命令拆分的路径不一定存在。无论路径是否存在,此命令都将对其进行拆分并为您提供结果。
但是,PowerShell Split-Path
命令还有另一个参数,名为 -Resolve
。此参数允许您解析通配符引用的项。如果使用此参数,则要拆分的路径和其中的项必须已经存在。
例如,要返回匹配 *.txt
文件扩展名的项,请运行以下命令。-Leaf
参数确保命令仅返回项目而不返回父容器。
(
*
)通配符表示要匹配的一个或多个字符,而(?
)表示单个字符通配符。
下面的结果列出了文件 TestFile_11.txt 到 TestFile_20.txt。这些文件都匹配了 .txt
文件扩展名。

要解决单个字符匹配,将星号(*)通配符替换为问号(?)通配符,如下所示。
下面的输出仅显示文件TestFile_20.txt,因为这个文件是唯一匹配的文件。

如果路径中包含转义字符,例如重音符号(“`”),请将路径括在单引号中以解析路径。例如,下面的命令将分割并解析包含转义字符的路径。

作为概念验证,如果不将该路径括在单引号中,命令将返回路径不存在的错误。如果使用双引号而不是单引号,也会出现相同的错误。

结论
PowerShell的Split-Path
命令是系统管理员和用户不可或缺的工具。本教程旨在教会您如何使用Split-Path
命令来分割任何给定路径,并根据您使用的参数返回特定元素。
您以前在任务中使用过Split-Path
吗?如果没有,本教程是否说服您在手动或自动化作业中使用它?或者您知道比PowerShell的Split-Path
更好的拆分路径的另一种方法吗?