当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 测试路径 Cmdlet

作者:精品下载站 日期:2024-12-14 13:04:44 浏览:13 分类:玩电脑

如何使用 PowerShell 测试路径 Cmdlet


如果您需要验证文件、注册表项、证书或任何其他 PowerShell 驱动器路径的路径,则需要 Test-Path cmdlet。

Test-Path cmdlet 是一种简单但有用的方法,可以快速检查文件和其他项目的许多属性。它可以检查文件是否存在(或其他项目类型)、字符串是否采用正确的路径格式,甚至项目是否比特定时间新或旧。

在本教程中,您将了解有关 PowerShell Test-Path cmdlet 的所有信息以及如何使用它来改进 PowerShell 脚本。

先决条件

如果您想按照本教程中的示例进行操作,您将需要一件事:电源外壳。更具体地说,本教程将在 Windows 10 上使用 PowerShell v7.03,尽管您将学到的许多技术也适用于旧版本。

测试路径 Cmdlet 的作用是什么?

PowerShell Test-Path cmdlet 是最简单的命令之一。这是一个从一开始就存在于 PowerShell 中的命令,并且只返回两个值;对或错。

但是,不要让简单性欺骗了你;它会为您节省大量时间来验证 PowerShell 脚本中的信息。

使用 PowerShell 提供程序和驱动器时,请将 PowerShell Test-Path cmdlet 视为质量控制。编写脚本时,您通常会使用 PowerShell 驱动器中包含的各种项目。 PowerShell 驱动器例如 C:\、 HKLM、Cert 等。

Test-Path 不适用于所有 PS 驱动器。例如,如果您尝试对注册表项使用Test-Path,它将起作用。如果您尝试对注册表值使用Test-Path,它每次都会返回False

如果您好奇,请立即在 PowerShel 中运行 Get-PSDrive cmdlet,并注意为您显示的所有 PS 驱动器。

[玩转系统] 如何使用 PowerShell 测试路径 Cmdlet

所有这些驱动器内部都有路径,例如C:\WindowsHKLM:\Software等。对于 PowerShell 脚本,最好先测试路径是否有效或不存在。这就是 PowerShell 的 Test-Path 的作用。

Test-Path 定义返回 TrueFalse 的条件,具体取决于是否满足特定条件(通常是文件/文件夹、注册表项、证书,甚至变量是否存在)。

测试路径参数和用法

与许多其他 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 存在,您可以测试 Foo 中以 Bar 开头的任何子文件夹 并且使用下面的命令正好是四个字符。

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

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

文字路径

LiteralPath 参数与 Path 参数几乎相同,但有一个例外;它不允许使用通配符。使用LiteralPath将按字面意思解释路径的值。

例如,如果您尝试使用 LIteralPath 在路径值内使用星号或问号,Test-Path 将完全忽略通配符并按字面测试 C:\Foo\Bar? 就像下面的例子一样。

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

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

路径类型

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

您可以使用 PathType 参数强制 Test-Path 进行更精细的测试,并专门针对容器或叶项进行测试。

默认情况下,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

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

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

筛选

根据微软的文档,Filter参数“以提供者的格式或语言指定过滤器。此参数的值符合 Path 参数的要求。过滤器的语法(包括通配符的使用)取决于提供商”。

尽管 Filter 参数应与其他 cmdlet(例如 Get-Childitem)一起使用,但很少与 Test-Path 一起使用。如果您发现 Filter 参数有很好的用途,请通过 Twitter @adbertram 联系。

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

较新

您是否曾经需要检查文件上的时间戳并据此做出决定?如果是这样,NewerThanOlderThan 参数可以节省大量代码。 NewerThan 参数检查项目的时间戳是否比特定日期新。

NewerThan 参数接受一个字符串或一个 DateTime 对象来表示要检查的时间戳。例如,要检查文件 C:\Foo\bar.txt 是否是在 2021 年 1 月 20 日之后创建的,您可以运行 Test-Path ,如下所示。

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

年长过

OlderThan 参数与 NewerThan 参数完全相同,但方向相反。此参数检查项目是否早于特定日期。

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

已验证

如果您曾经在脚本中动态构建过路径,您就会知道其中的困难。有时您可能会误按某个键或以某种方式在路径中获得一些特殊字符;如果是这样,则 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 参数。

凭据

尽管您会在 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:运行远程代码的最佳方式

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯