首页 > 解决方案 > 按文件名搜索文件并使用结果搜索新文件 - Powershell

问题描述

在使用我的搜索结果时遇到问题。我递归地搜索一个文件夹以将所有大于 3 kb 的文件带给我。然后我需要使用这些文件的名称来查找所有具有相似名称的文件并将它们全部复制到一个新文件夹中。根目录包含:

folder1: 0050

DLD1900394819102600500001_a.txt 7kb

DLD1900394819102600500001_b.txt 1kb 

DLD1900394819102600500001_c.txt 1kb

DLD1900394819102600500151_a.txt 1kb

DLD1900394819102600500151_b.txt 1kb

folder2: 0051

DLD1900394819102600500002_a.txt 7kb

DLD1900394819102600500002_b.txt 1kb 

DLD1900394819102600500002_c.txt 1kb 

DLD1900394819102600500122_a.txt 1kb 

DLD1900394819102600500122_b.txt 1kb

所以通过使用这个

$Path  = "C:\test\"
$test = Get-ChildItem $Path  -recurse | 
    where-object {$_.length -gt 3000} | 
    ForEach-Object {$_.basename.replace("_a","")}

我发现所有大于 3 kb 的内容都删除了“_a”字符,我将这两个字符作为对象

DLD1900394819102600500001

DLD1900394819102600500002

,但是如何再次搜索所有文件夹以选择和复制

DLD1900394819102600500001*.*

DLD1900394819102600500002*.* 

到新文件夹???

标签: powershell

解决方案


我不是 100% 确定我理解你的问题。这是你要找的吗?

#Original code
$Path = 'C:\test'
$BaseNames = 
    ((Get-ChildItem -Path $Path -Recurse) | 
        Where-Object{$_.Length -gt 3000}|
            Select-Object -ExpandProperty BaseName) |
                ForEach-Object{$_.Replace('_a','')}

#Use Regular expression to filter names
$regexBaseNames = ''
ForEach($name in $BaseNames){$regexBaseNames += "^$name.*[.].+|"}
#Remove pipe from end of regex expression
$regexBaseNames = $regexBaseNames.Substring(0,$regexBaseNames.Length - 1)
#Get files whose name matches regex expression
$Files = Get-ChildItem -Path $Path -Recurse | 
    Where-Object{$_.Name -match $regexBaseNames}

如果这不是您想要的,您能否详细说明您正在尝试做什么以及为什么需要这样做?这可能有助于回答您的问题。

注意 1:按照我的方式构建字符串可能非常耗费资源。如果您有很多要附加到字符串的基本名称,请考虑使用 StringBuilder .NET 类。

注意 2:您可能需要考虑构建一个 BaseName 数组以传递给 -Filter PowerShell 参数,然后分别对每个基本名称执行操作。如果您决定使用 Filter 方法(当涉及数千个文件时,PowerShell 通常比通过管道传输到 Where-Object 执行得快得多),您还可以将所有文件传递到单个数组列表中,然后使用ForEach 循环。

如果您需要我,我会给出这些建议的示例,我发现您的问题会从其中任何一个中受益。


推荐阅读