![如果文件文本包含太多值,则防止错误移动和垃圾邮件文件夹](https://linux22.com/image/1567762/%E5%A6%82%E6%9E%9C%E6%96%87%E4%BB%B6%E6%96%87%E6%9C%AC%E5%8C%85%E5%90%AB%E5%A4%AA%E5%A4%9A%E5%80%BC%EF%BC%8C%E5%88%99%E9%98%B2%E6%AD%A2%E9%94%99%E8%AF%AF%E7%A7%BB%E5%8A%A8%E5%92%8C%E5%9E%83%E5%9C%BE%E9%82%AE%E4%BB%B6%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我在文本中使用了这个长列表。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