如果.txt文件中存在匹配项,则将文件移动到Year文件夹中

时间:2018-08-11 14:37:22

标签: powershell batch-file

我有这样的文件

Taxi driver.torrent
Tabu - Gohatto.txt
Troll 2 (1990)..zip

在我的filelist.txt文件中,我有这样命名的文件

Troll 2 (1990) [BDrip 1080p - H264 - Ita Ac3] Horror, Commedia
Troll 2 (1990) [XviD - Ita Mp3]
Taxi Driver (1976) Mastered..
Tabù - Gohatto (N. Oshima, 1999)

我只有类似的文件夹

1976
1990
1999

我想通过这种方式将文件移到正确的Year文件夹中

1976
  |__ Taxi driver.torrent

1990
  |__ Troll 2 (1990)..zip

1999
  |__ Tabu - Gohatto.txt

我使用此路径,文件夹

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

编辑:

此poweshell存在许多问题。例如

Caccia al delitto

被移到了1990年的文件夹中...但是.. Caccia al delitto是1986年。 我拥有的内部文件文字

Caccia a Ottobre Rosso (1990) [DivX - Ita Mp3] Guerra [CURA] Russia
Caccia a Ottobre Rosso (1990) [VP9 - Ita Eng Opus] Thriller

我没有关于Caccia al delitto的文本字符串(我将其删除以进行测试)

1 个答案:

答案 0 :(得分:1)

$movies = @()
$movieLocation = 'C:\Path'
$torrentPath = '.'

(get-content "$movieLocation\Test4.txt") | foreach($_) {

 # Check for braces.
 if (-not($_ -match ".*\(.*\).*")) {return}

 $properties = @{
  date = ($_ -replace ".+?\(.*?(\d{4}).*?\).*", '$1')
  name = $_.substring(0, $_.IndexOf("(")).Trim()
 }

 # Add items that have a 4 digit date.
 if ($properties.date -match "^\d{4}$") {
  'Name: "' + $properties.name + '" Date: "' + $properties.date + '"'

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

$torrentFiles = dir $torrentPath

foreach ($movie in $movies) {
 $datePath = "$movieLocation\$($movie.date)"

 if (-not(test-path "$datePath")) {
  new-item "$datePath" -ItemType "directory"
 }

 foreach ($torrentFile in $torrentFiles) {
  # Get percentage based on length.
  $pc = [int]($movie.name.length / $torrentFile.basename.length * 100)

  # Only between 80% and 100% in length.
  if ($pc -gt 100) {continue}
  if ($pc -lt 80) {continue}

  if ($torrentFile.basename -match $movie.name) {
   # Items that match.
   'Torrent: {0,-40} Date: {1,-5} Match: {2}' -f $torrentFile.basename, $movie.date, $movie.name

   if (-not(test-path "$datePath\$torrentfile")) {
    Move-Item -LiteralPath "$torrentPath\$torrentfile" -Destination "$datePath"
   }
  }
 }
}

使用正则表达式对date进行了适度的修复。 name需要修剪以删除尾随空格。 我在test-path之前添加了move-item,以防找不到文件。

自从上次使用Powershell以来已有很长时间了,因此也许可以进一步改善。 我在路径.中进行了测试,因此希望C:\Path也能正常工作。