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