使用搜索结果时出现问题。我递归搜索一个文件夹,以将所有大于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*.*
到新文件夹??
答案 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循环。
如果您需要我会提供这些建议的示例,我发现您的问题将从这些建议中受益。