【问题标题】:Powershell script to search for similar filenames用于搜索相似文件名的 Powershell 脚本
【发布时间】:2021-03-11 12:12:47
【问题描述】:

我正在尝试构建一个 PowerShell 脚本,该脚本可以在文件夹中搜索具有相似名称的文件。

文件将始终具有相似的名称模板:

filename(C).TIF
filename(M).TIF
filename(Y).TIF
filename(K).TIF

我需要做的就是提取“文件名”,检查是否有 4 个相似的(C、M、Y、K)并将其用作移动这些文件的变量。

$files = Get-ChildItem -Path "E:\test" -Filter "*.TIF" |
    Foreach-Object {$_.BaseName} | Sort-Object -Unique 

$files = $files -replace ".{3}$" 

$names = (Get-Unique -InputObject $files)  
$names

结果如下:

jobname 
jobname 
jobname 
jobname 
test 
test 
test 
test

但我需要按唯一性排序并计算它们,也许,在行动之前。

【问题讨论】:

  • 这很简单,您能告诉我们您的代码在哪里遇到问题吗?
  • $files = Get-ChildItem -Path "E:\test" -Filter "*.TIF" | Foreach-Object {$_.BaseName} | Sort-Object -Unique $files = $files -replace ".{3}$" $names = (Get-Unique -InputObject $files) $names 这是输出:jobname jobname jobname jobname test test test test 我的策略是比较或计算唯一的,并仅在计数为 4 时触发操作。

标签: powershell search


【解决方案1】:

但我需要按唯一性排序并计算它们,也许,在行动之前。

你肯定想要Group-Object cmdlet

顾名思义,它...对对象进行分组,基于一些共同的属性:

$filesByCommonBaseName = Get-ChildItem -Path "E:\test" -Filter "*.TIF" |Group-Object { $_.BaseName -replace '.{3}$' }

现在您已将它们正确分组,您可以开始对它们进行操作:

foreach($entry in $filesByCommonBaseName){
    Write-Host "Operating on files starting with $($entry.Name)"
    if($entry.Count -eq 4){
        # we found four matches, move them!
        $entry.Group |Move-Item -Destination $destinationDir -Force
    }
}

【讨论】:

  • @mathias-r-jessen 非常感谢您的建议,它可以按文件名过滤和分组。我以前没有使用过它们。我可以单独询问每个 Group-object 以检查它们是否与文件数匹配吗?
  • @user3457421 当然 - Group-Object 输出具有 NameCountGroup 属性的对象集合 - Group 属性包含原始项目的数组:@ 987654330@ test* 文件
  • @mathias-r-jessen 太棒了。如果我正在寻找一个特定的字符串,那可以工作,但我需要的是脚本在 Group-Object 中搜索名称,如果有 4 个条目,则移动这些特定文件。对于愚蠢的问题,我很抱歉。
  • @user3457421 我已经更新了答案,这是否让您更清楚如何做到这一点?
  • @mathias-r-jessen 这很有意义。谢谢你。我还能在组对象中使用过滤器功能吗?喜欢过滤器“*(C).TIF”|这样做... -过滤器“(M).TIF” |做点别的事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2023-03-13
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
相关资源
最近更新 更多