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

[玩转系统] 如何在 PowerShell 中使用 Test-Path cmdlet

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

如何在 PowerShell 中使用 Test-Path cmdlet


在 PowerShell 中处理文件或文件夹时,在尝试读取或保存内容之前测试路径是否存在非常重要。这就是 Test-Path cmdlet 的用武之地。它检查路径的所有元素是否存在并返回 $true$false

现在,PowerShell 中的 Test-Path cmdlet 不仅限于文件和文件夹。它还可用于测试注册表路径,测试文件是否比特定日期更新,并验证路径是否为有效路径。

在本文中,我们将了解如何使用 Test-Path cmdlet 并了解可以使用它执行的不同选项。

PowerShell 测试路径

PowerShell Test-Path cmdlet 附带了我们可以使用的不同参数。我在下面列出了最常用的参数:

-Path

测试路径

-Include

指定要包含的路径元素,例如 *.txt

-Exclude

指定要排除的路径元素,例如 *.txt

-PathType

允许您检查路径是否是容器、叶子或其中之一

-IsValid

检查路径是否是有效路径

-OlderThan

检查文件是否早于指定的日期时间对象

-NewerThan

检查文件是否比指定的日期时间对象新

因此,为了简单地测试路径是否存在,我们只需要指定路径,cmdlet 将返回 $true$false ,具体取决于路径的所有元素是否存在或不:

Test-Path -Path "c:\Temp\TestFiles"

# Result
True

我们可以在脚本中通过简单的 if 语句使用它,如下所示:

$path = "c:\Temp\TestFiles"

if (Test-Path -Path $path) {
  Get-ChildItem -Path $path
}

PowerShell 检查文件是否存在

我们还可以使用PowerShell中的Test-Path来检查文件是否存在。为此,我们需要指定完整路径,包括路径参数中的文件名:

# Check if the file LineNumbers.txt exists
$file = "C:\Temp\TestFiles\LineNumbers.txt"
Test-Path -Path $file

# Result
True

现在,在这种情况下,我们显然正在检查一个文件,因为我们已经指定了包含带有扩展名的文件的完整路径。但如果您不知道该路径是否指向文件或文件夹,则可以指定 PathType 参数。

假设我们想知道 $profile 是否指向一个文件。为此,我们将 PathType 设置为 Leaf

# Check if $profile is a file:
Test-Path -Path $profile -PathType leaf

# Result
True

PowerShell 检查文件夹是否存在

就像文件一样,我们也可以在 PowerShell 中检查文件夹是否存在。为此,我们只需要指定文件夹的路径:

Test-Path -Path "c:\Temp\TestFiles"

# Result
True

如果我们想确保路径指向一个文件夹,那么我们可以添加-PathType参数并将其设置为container。这样,Test-Path cmdlet 不仅会检查路径是否存在,还会检查它是否是文件夹:

# Check if $profile is a folder:
Test-Path -Path $profile -PathType container

# Result
False

如果你想知道文件夹中是否包含文件,那么就不需要使用Get-ChildItem等进行计数,我们只需使用Test-Path并添加通配符*即可 来检查给定路径中是否有文件:

# Check if there are files in the folder
Test-Path -Path "c:\Temp\TestFiles\*"

# Result
True

使用包含和排除

如果您想测试文件夹是否包含特定文件,则可以使用 -include-exclude 参数。这样我们就可以检查文件夹是否包含指定的文件类型或除指定文件类型之外的任何文件。

例如,我们要检查以下路径中是否有日志文件:

# Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Include *.log

# Result
False

如果我们想测试除了 .log 文件之外是否还有其他文件,那么我们可以使用排除,例如:

# Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Exclude *.log

# Result
True

[玩转系统] 如何在 PowerShell 中使用 Test-Path cmdlet

测试路径是否有效

当您在脚本中动态创建路径时,最好测试生成的路径是否是有效路径。为此,我们可以使用参数-IsValid。这不会检查路径是否存在,仅检查它是否有效。

例如,我们可以检查 PATH 系统变量中的所有位置是否都是有效路径:

$env:path -split ";" | Test-Path -IsValid

或者也许更简单的例子是:

$storage = "c:\temp\testfiles\"
$newFolder = "\LazyFolder"
$path = $newFolder + $storage # yes, the wrong way around

Test-Path -path $path -IsValid

# Result
False

检查文件或文件夹是否比某个日期新或旧

除了测试路径是否存在之外,我们还可以检查文件或文件夹是否比指定日期新或旧。如果您想知道文件是否已更新,这尤其有用。

参数 -NewerThan-OlderThan 需要日期或日期时间对象。这可以是日期时间字符串或数据时间对象。因此,要测试文件夹“testfiles”是否比二月一日新,我们可以执行以下操作:

Test-Path -Path "C:\Temp\TestFiles\" -NewerThan "01 feb 2023"

# Result
True

但我们也可以检查该文件夹是否超过 3 天。为此,我们首先在 PowerShell 中创建一个日期对象,然后可以在 Test-Path cmdlet 中使用该对象:

# Get the date from 3 days ago
$date = (Get-Date).AddDays(-3)

# Test if the folder is newer
Test-Path -Path "C:\Temp\TestFiles\" -NewerThan $date

当然,您也可以对 OlderThan 执行相同的操作。

使用 PowerShell 测试注册表路径

PowerShell 中的 Test-Path cmdlet 还可用于检查注册表路径是否存在。现在这里需要注意一件重要的事情,它无法测试注册表项。

如果您查看下面的屏幕截图,我们可以测试关键 Outlook (1) 是否存在。但我们无法测试条目“OutlookName”(2) 是否存在。

[玩转系统] 如何在 PowerShell 中使用 Test-Path cmdlet

因此,要测试注册表项,我们只需指定该注册表项的路径,如下所示:

Test-Path -Path "HKCU:\Software\Microsoft\Office.0\Outlook"

正如您在下面的结果中看到的,关键 Outlook 的路径存在,但找不到 OutlookName 条目的路径:

[玩转系统] 如何在 PowerShell 中使用 Test-Path cmdlet

总结

在任何编程或脚本语言中,测试或验证资源是否存在都很重要。它可以帮助您防止脚本中出现错误或意外行为,并允许您进行正确的错误处理。

PowerShell 中的 Test-Path cmdlet 的功能比大多数人想象的要多,但在所有情况下,它只输出 true 或 false。

我希望这篇文章对您有用,如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯