PowerShell Test-Path Cmdlet:验证文件、密钥等

如果您需要验证文件路径、注册表键、证书或任何其他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驱动器。

PS Drives after running Get-PSDrive

所有这些驱动器都有像C:\Windows,HKLM:\Software等的路径。在编写PowerShell脚本时,始终首先测试路径是否有效或是否存在。这就是PowerShell的Test-Path的作用。

Test-Path定义了一个条件,根据特定条件是否满足(通常是文件/文件夹、注册表键、证书甚至变量是否存在)返回TrueFalse

Test-Path参数和用法

像许多其他 PowerShell cmdlet 一样,Test-Path cmdlet 具有各种参数来改变其行为。现在让我们逐个讨论每个参数,并演示它是如何工作的以及可能期望看到的结果。

路径

Path 参数是您将在每个 Test-Path 执行中使用的必需参数。 Path 参数定义了您要测试存在性的 PSDrive 路径。

例如,如果您想要测试文件夹 C:\Foo 是否存在,您将向 Path 参数提供适当的路径。然后,根据 C:\Foo 实际是否存在,Test-Path 将返回 TrueFalse

PS> Test-Path -Path 'C:\Foo'
True

相同的技术也可以用于任何项目路径。也许您想要测试注册表键 HKLM:\Software\Foo 是否存在。只需使用注册表键路径与 Path 参数。

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

请注意,本教程中演示的所有技术都适用于任何 PowerShell 驱动器路径。

使用通配符

如果您不在乎路径是否具有文字值,而只想检查路径是否与特定模式匹配会发生什么情况。在这种情况下,您可以在 Path 值中使用通配符。

也许您想要检查您的 C:\Foo 文件夹是否包含任何以 Bar 开头的子文件夹。在这种情况下,您可以使用通配符。

PS> Test-Path -Path 'C:\Foo\Bar*'

一旦执行上述命令,Test-Path 将检查以 任何Bar 开头的文件夹是否存在,并根据是否存在匹配该条件的文件夹返回 TrueFalse

星号(*)匹配一个或多个字符,但您也可以使用问号(?)来更精确地测试单个字符。

以上的场景作为示例,如果文件夹 C:\Foo\Bar1 存在,则可以使用以下命令测试以 Bar 开头且恰好为四个字符的 Foo 的任何子文件夹。

PS> Test-Path -Path 'C:\Foo\Bar?'

如果出于某种原因,您想使用带通配符的 Path 参数,但又想确切匹配通配符字符,例如 *,您始终可以使用反引号(`)来转义通配符字符。

LiteralPath

LiteralPath 参数与 Path 参数几乎相同,唯一的区别在于它不允许使用通配符。使用 LiteralPath 将会将路径值 字面 解释。

例如,如果您尝试在使用 LIteralPath 时将星号或问号放在路径值内部,Test-Path 将完全忽略通配符字符,并且像以下示例一样对 C:\Foo\Bar? 进行字面测试。

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

如果您不需要使用任何通配符字符,以确保 Test-Path 测试您所期望的路径,应将 LiteralPath 用作默认路径参数。

PathType

默认情况下,当你运行Test-Path并提供一个路径时,如果在该路径中找到任何内容,它将返回True。路径中的项可以是像文件夹、注册表键、证书存储等的容器,也可以是像文件、注册表值或证书之类的叶子

你可以强制Test-Path更加细致地测试特定的容器或叶子项,使用PathType参数。

默认情况下,Test-Path使用PathTypeAny

例如,假设在C:\Foo\Bar路径下有一个文件夹,你想要查找该路径下的文件,你可以使用如下所示的PathType参数。你只想检查是否存在名为C:\Foo\Bar的文件。

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

或者,也许你需要确认C:\Foo\Bar是否实际上是一个文件。在这种情况下,你会检查一个容器。

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

包括

如果使用Path参数和通配符,有时你需要更加具体。在这种情况下,你需要查看IncludeExclude参数。

假设你有以下文件夹:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

你想检查是否存在任何以Bar开头且正好四个字符的文件夹,如Bar1Bar2等。

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

上述命令可以正常工作,但现在你只想找到C:\Foo中名为Bar2的文件夹。在这种情况下,你可以使用Include参数。

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

上面的命令现在只测试了一个文件夹C:\Foo\Bar2。你可能最好直接使用Test-Path -Path 'C:\Foo\Bar2' -PathType Container

排除

Exclude参数的工作原理类似于Include参数,只是这次它排除了与字符串匹配的路径。

也许你想确保C:\Foo文件夹内至少有一个文件,并且你可以使用以下命令:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

上述命令会返回TrueFalse,如果C:\Foo中有任何文件的话。但也许你想确保除了txt扩展名的文件之外的任何文件都存在。在这种情况下,你可以使用Exclude参数,并使用通配符来排除所有带有txt扩展名的文件。

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

筛选

根据微软的文档,Filter参数“指定了提供程序格式或语言的筛选器。此参数的值限定为Path参数。筛选器的语法(包括通配符字符的使用)取决于提供程序”。

虽然Filter参数应该与其他命令一起使用,例如Get-Childitem,但几乎从未与Test-Path一起使用。如果你发现了Filter参数的好用之处,请在 Twitter 上联系 @adbertram。

相关: Get-ChildItem: 将文件、注册表、证书等列为一个

NewerThan

您是否曾经需要检查文件的时间戳并基于此做决定?如果是这样,NewerThanOlderThan 参数可以节省大量代码。

NewerThan 参数检查项目的时间戳是否比特定日期更新。该参数接受字符串或 DateTime 对象表示的时间戳,用于检查。例如,要检查文件 C:\Foo\bar.txt 是否在 2021 年 1 月 20 日之后创建,可以运行以下 Test-Path 命令。

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## 或者
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

OlderThan 参数与 NewerThan 参数完全相同,只是相反。该参数检查项目是否比特定日期

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## 或者
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

如果您曾经在脚本中动态构建路径,就会知道其中的困扰。有时可能会误按键或在路径中添加特殊字符;如果是这样,IsValid 参数就派上用场了。

IsValid 参数是一个独特的参数,它将 Test-Path 不仅转变为检查项目存在性的 cmdlet,还将其转变为检查路径语法的 cmdlet。该参数确认路径是否有效。

例如,也许您需要验证路径是否在语法上有效。您正在使用一些变量并将它们连接起来以构建路径。

在连接路径时,始终使用Join-Path cmdlet。这仅为示例目的!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

现在,为了确保您动态创建的路径有效,请使用如下的IsValid参数。您会发现Test-Path返回False

PS> Test-Path -LiteralPath $path -IsValid
False

路径abc:dffC:\现在是无效的路径,这使您能够从这种情况中创建验证例程。

如果您使用的是 PowerShell v6.1.2 或更早版本,并且同时使用IsValidPathType参数,Test-Path将忽略PathType参数。

Credential

即使您在Test-Path上找到Credential参数,您可能会认为可以使用它以其他用户的身份进行身份验证 PS 驱动器。这是一个有效的假设,但是是错误的。

遗憾的是,Credential参数在Test-Path cmdlet 中的作用不大。如果要以其他凭据调用Test-Path,Microsoft建议使用Invoke-Command cmdlet,并在那里使用Credential参数。

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

相关: Invoke-Command:运行远程代码的最佳方法

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