PowerShell:在目录中查找类似的文件名

时间:2018-03-09 17:13:47

标签: powershell

在一个纯粹假设的情况下,一个人下载了一些电视剧集,但想知道他/她是否意外地下载了HDTV,WEBRip和WEB-DL版本的一集,PowerShell如何才能找到这些剧集。重复'那么可以自动删除质量较低的版本吗?

首先,我得到目录中的所有文件:

$Files = Get-ChildItem -Path $Directory -Exclude '*.nfo','*.srt','*.idx','*.sub' |
  Sort-Object -Property Name

我现在排除非视频扩展,因为它们会导致误报。我仍然需要处理它们(在删除阶段)。

此时,我可能会使用ForEach构造逐个解析文件并查找具有相同剧集编号的文件。如果有的话,应该看一下。

假设公共空格等于点符号,典型文件名为AwesomeSeries.S01E01.HDTV.x264-RLSGRP

要比较,我只需要获得剧集编号。在上述情况下,这意味着S01E01

If ($File.BaseName -match 'S*(\d{1,2})(x|E)(\d{1,2})') { $EpisodeNumber = $Matches[0] }

S01E01E02的情况下,我只想添加第二个if语句,所以我暂时不关心它。

$EpisodeNumber现在应该包含S01E01。我可以使用它来发现$Files中是否有任何其他文件包含该剧集编号。我可以这样做:

$Files -match $EpisodeNumber

这是我的麻烦开始的地方。以上也将返回我正在处理的文件。我现在可以立即处理重复项,但是我必须再次执行Get-ChildItem因为否则当ForEach构造到达重复文件时将返回相同的匹配,这将导致错误。< / p>

我可以将我想要删除的文件存储在一个数组中,并在ForEach contruct结束后处理它们,但是我仍然需要过滤掉所有重复项。毕竟,在ForEach循环中,
AwesomeSeries.S01E01.HDTV.x264-RLSGRP
会先匹配 AwesomeSeries.S01E01.WEB-DL.x264.x264-RLSGRP,仅限于 AwesomeSeries.S01E01.WEB-DL.x264.x264-RLSGRP
匹配
AwesomeSeries.S01E01.HDTV.x264-RLSGRP之后。

所以也许我应该只处理一次剧集编号,但是怎么办?

我感觉我在这里效率很低,必须有更好的方法来做到这一点,所以我要求帮助。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

在匹配时过滤$Files数组以排除当前文件:

($Files | Where-Object {$_.FullName -ne $File.FullName}) -match $EpisodeNumber

关于数组中的重复项,您可以使用Select-Object -Unique仅获取不同的条目。

答案 1 :(得分:0)

由于您知道如何获取剧集编号,因此我们可以使用该编号将文件组合在一起。

$Files = Get-ChildItem -Path $Directory -Exclude '*.nfo','*.srt','*.idx','*.sub' | Select-Object FullName, @{Name="EpisodeIndex";Expression={
    # We do not have to do it like this but if your detection logic gets more complicated then having
    # this select-object block will be a cleaner option then using a calculated property
    If ($_.BaseName -match 'S*(\d{1,2})(x|E)(\d{1,2})'){$Matches[0]}
}}

# Group the files by season episode index (that have one). Return groups that have more than one member as those would need attention.
$Files | Where-Object{$_.EpisodeIndex } | Group-Object -Property EpisodeIndex | 
    Where-Object{$_.Count -gt 1} | ForEach-Object{
    # Expand the group members
    $_.Group
    # Not sure how you plan on dealing with it. 
}