Return Powershell 中第一个匹配的文件夹

Return first matched folder in Powershell

我有一个 ID 数组,在一个共享中有相应的目录:

$ids = @('12345','25356','74678')
- C:
-- 2020
--- 12345678 SURNAME
---- 12345
----- 12345_SubDir01
----- 12345_SubDir[n]
--- 23648844 SURNAME
---- 25256
----- 25256_SubDir01
----- 25256_SubDir[n]

我想遍历字母 C: 中的所有目录并找到第一个匹配项(ID 不是子目录的 ID)。所以我想匹配 12345 而不是 12345_SubDir01.

到目前为止我发现的行(虽然效率低下)有效但随后继续搜索直到它迭代了根共享中的每个目录(我们有超过 500,000 个文件夹和子文件夹)。

我正在使用的脚本行:

Get-ChildItem C: -Recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.Name -match "12345" }

有没有办法让脚本在与 ID 匹配后停止,以便在找到目录后不再继续搜索?

我希望能够在脚本的后半部分使用输出路径,但是每次 ID 匹配需要大约 20 分钟才能传递下去..

归功于 Doug Maurer for | Select-Object -First 1. The docs 可以更清楚地说明 管道实际上会在收到指定数量的输入对象后立即退出 (在我们的情况下,当找到第一个匹配的名称时)。

Get-ChildItem C:\ -Directory -Recurse | Where-Object -Property Name -eq 12345 | Select-Object -First 1

进一步改进:

  • 在这个简单的例子中,我们可以通过仅使用参数而不是 Where-Object.

    的脚本块来使一切更加简洁

    Get-ChildItem -Directory 限制对目录的检索。类似地,有 -File。请注意,这些需要 PS v3+。 对于较旧的 PS 版本,可以查询 $_.PSIsContainer 如问题所示。

  • 确保在 C: 后附加一个反斜杠。如果不带反斜杠传递驱动器,您将只在驱动器的 当前目录 中搜索!试试看:cd c:\windows; Get-ChildItem C:。您将列出“windows”目录的内容。反斜杠解决了这个问题,因为您现在指定的是根目录,而不仅仅是驱动器。

  • 使用运算符 -eq 进行精确(不区分大小写)匹配。使用运算符 -match 时,您会得到 12345_SubDir01 不需要的匹配项,因为 -match 默认执行子字符串搜索。