Impede a movimentação incorreta e a dobra de spam se o filetext contiver valores demais

1

Eu uso essa longa lista no arquivo de texto .txt para mover arquivos para pastas YEAR link

Eu tenho esses arquivos (exemplos) na pasta que eu quero mover

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

Eu uso este caminho, pastas

C:\Path
Test4.txt
script_powershell.ps1

Eu uso este script para mover arquivos para a pasta YEAR : Eu realmente testei com o PowerShell 5 para mover

$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
 }
 }
}

Mas este arquivo

Caccia al delitto

é movido na pasta 1990 mas, em vez disso, ele não deve ser movido porque não está na lista de lista de arquivos .. A pasta 1990 é gerada corretamente, mas também muitas outras pastas de spam são geradas devido à longa lista .txt list

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

Como evitar esse mecanismo de spam?

    
por Super Sonic 11.08.2018 / 20:42

1 resposta

0

Eu vejo várias falhas com sua abordagem / código.

  • para extrair a data, você precisará de um RegEx para corresponder exatamente a um ano (4 dígitos), seguido por um parênteses de fechamento. Seu arquivo pastebin inclui alguns padrões (Mux by Little-Boy) ou (Zeffirelli,1990) que sua tentativa de substring detecta erroneamente.
  • seu algorythm correspondente falhará ao criar um valor $significant alto em linhas como:
    1990 - I guerrieri del Bronx (1982) [BDMux 1080p - H265 - Ita Aac Eng DTS] Azione, Fantascienza
    com conteúdo irrelevante para a correspondência da contagem de todas as palavras com um comprimento maior 1, que um arquivo com a maioria dos casos não corresponderá. Eu excluiria o conteúdo entre colchetes e possivelmente as categorias finais.
  • o código é altamente ineficiente, iterando cada linha do test4.txt, iterando cada arquivo do torrentpath e iterando cada palavra dos nomes de arquivos atuais.
  • seu uso de if($torrentFile.BaseName -match $word){ deve resultar em erro porque os colchetes no conteúdo da linha estão sendo interpretados como um intervalo incompleto; use em vez disso: if($torrentFile.BaseName -match [RegEx]::Escape($word)){

Portanto, esse script otimizado só criará pastas de ano corretas,
tira todas as palavras que seguem um [ ou ( até o fim | e inverte o ForEach contando / enumerando palavras no torrent

## 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}
}

O script só será movido após a confirmação,
para remover este recurso de teste / segurança, o -Confirm paramter após o Move-Item deve ser comentado / removido.

Meu ambiente de teste depois de executar o script:

> 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
    
por 12.08.2018 / 19:18

Tags