如果文件文本包含太多值,则防止错误移动和垃圾邮件文件夹

如果文件文本包含太多值,则防止错误移动和垃圾邮件文件夹

我在文本中使用了这个长列表。TXT文件将文件移动到 YEAR 文件夹中 https://pastebin.com/raw/aRP94peb

我想要移动文件夹中的这些文件(示例)

Caccia a Ottobre Rosso.torrent
Caccia al delitto
caccia al delitto [divx, test 1986]

我使用这个路径,文件夹

C:\Path
Test4.txt
script_powershell.ps1

我使用这个脚本将文件移动到自己的文件夹:我实际上用 powershell 5 测试移动

$movies = @()
(get-content C:\Path\Test4.txt) | foreach($_){
$properties = @{
date = $_.substring($_.IndexOf("(")+1,4)
name = $_.substring(0,$_.IndexOf("("))
}
write-host $date
write-host $name

$movies += New-Object PSObject -Property $properties
}

$torrentFiles = dir $torrentPath

foreach($movie in $movies){
$datePath = "C:\Path\$($movie.date)"
if(-not(test-path $datePath)) {
new-item $datePath -ItemType "directory"
}
$words = ($movie.name -split '\s') | ?{ $_.Length -gt 1}
$significant = $words.Count
 foreach($torrentFile in $torrentFiles){
 $matchingWords = 0
  foreach($word in $words){
   if($torrentFile.BaseName -match $word){
    $matchingWords += 1
   }
  }
  if($matchingWords -ge $significant){
  Move-Item -path $torrentfile -Destination $datePath
 }
 }
}

但是这个文件

Caccia al delitto

在文件夹中移动1990,但实际上它不应该移动,因为它不在文件文本列表中。
1990文件夹已正确生成,但由于 .txt 列表中的列表过长,还生成了许多其他垃圾邮件文件夹

Cont
1982
Zeff
Unde
Stal
Sara
Risi
Norm
Mani
Kasd
Hugh
Harl

如何防止这种垃圾邮件机制?

答案1

我发现你的方法/代码存在几个缺陷。

  • 要提取日期,您需要一个 RegEx 来精确匹配年份(4 位数字),至少后面要有一个右括号。您的 pastebin 文件包含一些模式,(Mux by Little-Boy)或者(Zeffirelli,1990)您的子字符串尝试错误地 grep 了这些模式。
  • $significant您的匹配算法将完全失败,因为在以下行上构建高值:
    1990 - I guerrieri del Bronx (1982) [BDMux 1080p - H265 - Ita Aac Eng DTS] Azione, Fantascienza
    内容与匹配计数无关每一个长度大于 1 的单词,文件很可能不会匹配。我会排除方括号中的内容以及可能的尾随类别。
  • 该代码效率极低,需要迭代 test4.txt 中的每一行、迭代 torrentpath 中的每个文件以及迭代当前文件名中的每个单词。
  • if($torrentFile.BaseName -match $word){由于行内容中的方括号被解释为不完整的范围,因此您的使用应该会出错;请改用:
    if($torrentFile.BaseName -match [RegEx]::Escape($word)){

因此,此精简脚本将仅创建正确的年份文件夹,
删除[(之后直到末尾的任何单词
,并反转 torrent 中的 ForEach 计数/枚举单词

## script_powershell.ps1
$torrentPath = 'A:\Path'
$templates   = 'A:\Test4.txt'

$movies = Select-String -Path $templates -Pattern "\((\d{4})\)" | ForEach-Object {
    $datePath = Join-Path $torrentpath $_.Matches.Groups[1].Value
    [PSCustomObject]@{
        datepath = $datePath
        name = ($_.Line -Replace '(\[|\().*$')
    }
    if(!(Test-Path $datePath)) {
        New-Item $datePath -ItemType "directory" | Out-Null
    }
}

$movies = $movies | Sort -unique Name

ForEach($torrentFile in (Get-ChildItem $torrentPath -File)){
    $words = @(($torrentfile.BaseName -Replace '(\[|\().*$' -split '\s|:|,|\.') -ne ''|
               Where-Object{ $_.Length -gt 1})
    $significant = $words.Count
    $datepath = ''
    ForEach($movie in ($movies|Where-Object Name -match $words[0])){
        $matchingWords = 0
        ForEach($word in $words){
            if($movie.Name -match $word){$matchingWords += 1 }
        }
        # "Movie:{0} `$matchingWords:{1},{2}" -f $movie.Name,$matchingWords,$significant
        if($matchingWords -ge $significant){$datepath = $movie.datepath }
    }
    if ($datepath){Move-Item -Path $torrentfile.FullName -Destination $datePath -confirm}
}

脚本只有在确认后才会移动,
要删除此测试/安全功能,必须注释掉/删除-Confirm后面的参数。Move-Item

运行脚本后的我的测试环境:

> tree \ /F
Auflistung der Ordnerpfade für Volume RamDisk
A:\
│   script_powershell.ps1
│   Test4.txt
└───PAth
    │   Caccia al delitto
    │   caccia al delitto [divx, test 1986]
    ├───1982
    └───1990
            Caccia a Ottobre Rosso.torrent

相关内容