按文件名搜索文件并使用结果搜索新文件-Powershell

按文件名搜索文件并使用结果搜索新文件-Powershell,powershell,Powershell,在使用我的搜索结果时遇到问题。我递归搜索一个文件夹,将所有大于3KB的文件都带到我这里。然后,我需要使用这些文件的名称,以便找到所有具有类似名称的文件,并将它们复制到一个新文件夹中。 根目录包含: folder1: 0050 DLD1900394819102600500001_a.txt 7kb DLD1900394819102600500001_b.txt 1kb DLD1900394819102600500001_c.txt 1kb DLD190039481910260050015

在使用我的搜索结果时遇到问题。我递归搜索一个文件夹,将所有大于3KB的文件都带到我这里。然后,我需要使用这些文件的名称,以便找到所有具有类似名称的文件,并将它们复制到一个新文件夹中。 根目录包含:

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","")}
我发现所有大于3KB的字符都会删除“_a”字符并 我将这两个结果作为一个对象

DLD1900394819102600500001

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

DLD1900394819102600500001*.*

DLD1900394819102600500002*.* 
转到新文件夹?

Get-ChildItem $Path -recurse -File | where-object {$_.length -gt 3000}  | ForEach-Object {Get-ChildItem -Filter ($_.basename.replace("_a","")) -File}

您已经有了文件名,只需将其传递给Get ChildItem即可

我不能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:以我的方式构建字符串可能会占用大量资源。如果您有很多基名要附加到字符串中,请考虑使用String Bu建d.NET类。< /P> 注2: 您可能需要考虑构建一个BaseNeMs数组,将其传递给-FieldPosiSek参数,然后单独执行每个基名称的操作。如果您决定使用筛选方法(当涉及数千个文件时,PowerShell通常比管道传输到何处对象快得多),您还可以将所有文件传递到单个数组列表中,然后使用ForEach循环对其执行所需的操作


如果您需要,我将给出这些建议的示例,我发现您的问题将从中受益。

让我再解释一下。在测试路径中,有数百个文件夹(如0050)包含数百个txt文件。首先,我想查找大于5KB的文件夹中的所有文件,如DLD1900394819102600500001_a.txt 7kb、DLD1900394819102600500002_a.txt(所有文件都具有*_a.txt格式)。然后我需要隔离它们的格式,如DLD1900394819102600001、DLD1900394819102600002,然后再次搜索C:\test上的所有文件夹,以查找具有以下格式的所有文件:DLD1900394819102600001*,DLD1900394819102600001*,在隔离新的搜索格式后的第二步,我有一个名称列表DLD1900394819102600001、DLD1900394819102600002,如何使用em再次搜索所有文件夹,以查找格式为DLD1900394819102600001*或DLD1900394819102600002*的文件名,依此类推。