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
默认执行子字符串搜索。
我有一个 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
默认执行子字符串搜索。