如果您需要验证文件路径、注册表键、证书或任何其他PowerShell驱动器路径,请使用Test-Path cmdlet。
Test-Path cmdlet是一种简单但实用的方法,可以快速检查文件和其他项目的许多属性。它可以检查文件(或其他项目类型)是否存在,字符串是否符合正确的路径格式,甚至可以检查项目是否比特定时间更新或更旧。
在本教程中,您将学习有关PowerShell Test-Path cmdlet的所有信息,以及如何在PowerShell脚本中使用它。
先决条件
如果您想跟随本教程中的示例,您需要一样东西;PowerShell。更具体地说,本教程将使用PowerShell v7.03在Windows 10上,尽管您将学到的许多技术也适用于较旧的版本。
Test-Path Cmdlet是做什么的?
PowerShell Test-Path cmdlet是最简单的命令之一。这是自PowerShell问世以来就存在的命令,只返回两个值;True或False。
但是,不要让这种简单性愚弄您;它将为您在验证PowerShell脚本中的信息时节省如此多时间。
将PowerShell的Test-Path cmdlet视为在使用PowerShell提供程序和驱动器时的质量控制。编写脚本时,您通常会使用PowerShell驱动器中包含的各种项目。像C:\,HKLM,Cert等PowerShell驱动器。
Test-Path
不能与所有PS驱动器一起使用。例如,如果您尝试使用Test-Path
对注册表键进行测试,它将起作用。如果您尝试使用Test-Path
来测试注册表值,则每次都会返回False
。
如果您好奇,请立即在PowerShell中运行Get-PSDrive
cmdlet,并注意显示的所有PS驱动器。

所有这些驱动器都有像C:\Windows,HKLM:\Software等的路径。在编写PowerShell脚本时,始终首先测试路径是否有效或是否存在。这就是PowerShell的Test-Path
的作用。
Test-Path
定义了一个条件,根据特定条件是否满足(通常是文件/文件夹、注册表键、证书甚至变量是否存在)返回True
或False
。
Test-Path参数和用法
像许多其他 PowerShell cmdlet 一样,Test-Path
cmdlet 具有各种参数来改变其行为。现在让我们逐个讨论每个参数,并演示它是如何工作的以及可能期望看到的结果。
路径
Path
参数是您将在每个 Test-Path
执行中使用的必需参数。 Path
参数定义了您要测试存在性的 PSDrive 路径。
例如,如果您想要测试文件夹 C:\Foo 是否存在,您将向 Path
参数提供适当的路径。然后,根据 C:\Foo 实际是否存在,Test-Path
将返回 True
或 False
。
相同的技术也可以用于任何项目路径。也许您想要测试注册表键 HKLM:\Software\Foo 是否存在。只需使用注册表键路径与 Path
参数。
请注意,本教程中演示的所有技术都适用于任何 PowerShell 驱动器路径。
使用通配符
如果您不在乎路径是否具有文字值,而只想检查路径是否与特定模式匹配会发生什么情况。在这种情况下,您可以在 Path
值中使用通配符。
也许您想要检查您的 C:\Foo 文件夹是否包含任何以 Bar 开头的子文件夹。在这种情况下,您可以使用通配符。
一旦执行上述命令,Test-Path
将检查以 任何 以 Bar 开头的文件夹是否存在,并根据是否存在匹配该条件的文件夹返回 True
或 False
。
星号(*
)匹配一个或多个字符,但您也可以使用问号(?
)来更精确地测试单个字符。
以上的场景作为示例,如果文件夹 C:\Foo\Bar1 存在,则可以使用以下命令测试以 Bar 开头且恰好为四个字符的 Foo 的任何子文件夹。
如果出于某种原因,您想使用带通配符的
Path
参数,但又想确切匹配通配符字符,例如*
,您始终可以使用反引号(`)来转义通配符字符。
LiteralPath
LiteralPath
参数与 Path
参数几乎相同,唯一的区别在于它不允许使用通配符。使用 LiteralPath
将会将路径值 字面 解释。
例如,如果您尝试在使用 LIteralPath
时将星号或问号放在路径值内部,Test-Path
将完全忽略通配符字符,并且像以下示例一样对 C:\Foo\Bar? 进行字面测试。
如果您不需要使用任何通配符字符,以确保
Test-Path
测试您所期望的路径,应将LiteralPath
用作默认路径参数。
PathType
默认情况下,当你运行Test-Path
并提供一个路径时,如果在该路径中找到任何内容,它将返回True
。路径中的项可以是像文件夹、注册表键、证书存储等的容器,也可以是像文件、注册表值或证书之类的叶子。
你可以强制Test-Path
更加细致地测试特定的容器或叶子项,使用PathType
参数。
默认情况下,Test-Path使用
PathType
值Any
。
例如,假设在C:\Foo\Bar路径下有一个文件夹,你想要查找该路径下的文件,你可以使用如下所示的PathType
参数。你只想检查是否存在名为C:\Foo\Bar的文件。
或者,也许你需要确认C:\Foo\Bar是否实际上是一个文件。在这种情况下,你会检查一个容器。
包括
如果使用Path
参数和通配符,有时你需要更加具体。在这种情况下,你需要查看Include
和Exclude
参数。
假设你有以下文件夹:
- C:\Foo\Bar1
- C:\Foo\Bar2
- C:\Foo\Bar3
你想检查是否存在任何以Bar开头且正好四个字符的文件夹,如Bar1、Bar2等。
上述命令可以正常工作,但现在你只想找到C:\Foo中名为Bar2的文件夹。在这种情况下,你可以使用Include
参数。
上面的命令现在只测试了一个文件夹C:\Foo\Bar2。你可能最好直接使用Test-Path -Path 'C:\Foo\Bar2' -PathType Container
。
排除
Exclude
参数的工作原理类似于Include
参数,只是这次它排除了与字符串匹配的路径。
也许你想确保C:\Foo文件夹内至少有一个文件,并且你可以使用以下命令:
上述命令会返回True
或False
,如果C:\Foo中有任何文件的话。但也许你想确保除了txt
扩展名的文件之外的任何文件都存在。在这种情况下,你可以使用Exclude
参数,并使用通配符来排除所有带有txt
扩展名的文件。
筛选
根据微软的文档,Filter
参数“指定了提供程序格式或语言的筛选器。此参数的值限定为Path
参数。筛选器的语法(包括通配符字符的使用)取决于提供程序”。
虽然Filter
参数应该与其他命令一起使用,例如Get-Childitem
,但几乎从未与Test-Path
一起使用。如果你发现了Filter
参数的好用之处,请在 Twitter 上联系 @adbertram。
相关: Get-ChildItem: 将文件、注册表、证书等列为一个
NewerThan
您是否曾经需要检查文件的时间戳并基于此做决定?如果是这样,NewerThan
和 OlderThan
参数可以节省大量代码。
NewerThan
参数检查项目的时间戳是否比特定日期更新。该参数接受字符串或 DateTime 对象表示的时间戳,用于检查。例如,要检查文件 C:\Foo\bar.txt 是否在 2021 年 1 月 20 日之后创建,可以运行以下 Test-Path
命令。
OlderThan
OlderThan
参数与 NewerThan
参数完全相同,只是相反。该参数检查项目是否比特定日期早。
IsValid
如果您曾经在脚本中动态构建路径,就会知道其中的困扰。有时可能会误按键或在路径中添加特殊字符;如果是这样,IsValid
参数就派上用场了。
IsValid
参数是一个独特的参数,它将 Test-Path
不仅转变为检查项目存在性的 cmdlet,还将其转变为检查路径语法的 cmdlet。该参数确认路径是否仅有效。
例如,也许您需要验证路径是否在语法上有效。您正在使用一些变量并将它们连接起来以构建路径。
在连接路径时,始终使用
Join-Path
cmdlet。这仅为示例目的!
现在,为了确保您动态创建的路径有效,请使用如下的IsValid
参数。您会发现Test-Path
返回False
。
路径abc:dffC:\
现在是无效的路径,这使您能够从这种情况中创建验证例程。
如果您使用的是 PowerShell v6.1.2 或更早版本,并且同时使用
IsValid
和PathType
参数,Test-Path
将忽略PathType
参数。
Credential
即使您在Test-Path
上找到Credential
参数,您可能会认为可以使用它以其他用户的身份进行身份验证 PS 驱动器。这是一个有效的假设,但是是错误的。
遗憾的是,Credential
参数在Test-Path
cmdlet 中的作用不大。如果要以其他凭据调用Test-Path
,Microsoft建议使用Invoke-Command
cmdlet,并在那里使用Credential
参数。