按文件名搜索文件,然后使用结果搜索新文件-Powershell

时间:2019-10-29 14:12:51

标签: 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*.* 

到新文件夹??

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我不确定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: 您可能要考虑构建一个BaseNames数组以传递给-Filter PowerShell参数,然后分别对每个基本名称执行操作。如果您决定使用Filter方法(当涉及成千上万个文件时,PowerShell的执行通常比传递到Where-Object的方法要快得多),还可以将所有文件传递到单个数组列表中,然后使用ForEach循环。

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

相关问题