1

Я использую этот длинный список в текстовом файле .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

Я использую этот сценарий для перемещения файлов в собственную папку YEAR : на самом деле я тестирую PowerSpace 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 ответ1

0

Я вижу несколько недостатков в вашем подходе / коде.

  • чтобы извлечь дату, вам нужно, чтобы RegEx точно совпадал с годом (4 цифры), за которым следуют закрывающие скобки. Ваш файл для вставки включает в себя несколько шаблонов (Mux by Little-Boy) или (Zeffirelli,1990) которые ваша попытка подстроки содержит ошибочно.
  • Ваш соответствующий алгоритм потерпит неудачу при полном построении высокого $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)){

Таким образом, этот упрощенный скрипт будет создавать только правильные папки,
удаляет любые слова после [ или ( до конца
и меняет счет / перечисление 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .