En Batch no sería nada productivo, resultaría algo lento y produciría un código muy sucio.
Por ese motivo aquí abajo te muestro una solución basada en .NET (en dos lenguajes diferentes, VB.NET y C#, produciendo un código idéntico. elige el que prefieras), solo debes especificar las rutas correspondientes en la variable
romsPath y el array
miscPaths, y llamar al método
RomUtil.CleanRoms().
Debo aclararte que para utilizar el siguiente código primero debes compilarlo (no lo puedes ejecutar directamente haciendo click en Windows...), y para ello lo puedes hacer con
Visual Studio.
Este código es reproducible en otros lenguajes como
Python,
Ruby, etc, en los cuales así mismo necesitarás descargar el intérprete. En
VBS también es reproducible, lo comento por que no necesitarías descargar "accesorios" adicionales (imagínatelo como hacer click en un archivo .bat), pero VBS también es un lenguaje limitado y habría que darle algunas vueltas con las funciones relacionadas del
FileSystem, resultaría en un código algo feo y yo simplemente he preferido no ponerme a escribir instrucciones de más en un lenguaje que está de menos, pudiendo llevar a cabo lo mismo en otro lenguaje superior.
C#:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Vb = Microsoft.VisualBasic;
public sealed class RomUtil {
public static readonly string romsPath = "C:\\...carpeta de las roms\\";
public static readonly string[] miscPaths = {
"C:\\...carpeta de las imágenes\\",
"C:\\...carpeta de los videos\\",
"etc..."
};
private RomUtil() {}
public static void CleanRoms() {
Func<FileInfo, FileInfo, bool> comparisonPredicate =
(FileInfo a, FileInfo b) => {
return Path.GetFileNameWithoutExtension(a.Name).Equals(Path.GetFileNameWithoutExtension(b.Name), StringComparison.OrdinalIgnoreCase);
};
IEnumerable
<FileInfo
> romFiles
= new DirectoryInfo
(romsPath
).GetFiles(searchPattern
: "*", searchOption
: SearchOption
.TopDirectoryOnly);
List
<FileInfo
> miscFiles
= new List
<FileInfo
>(); foreach (string dirpath in miscPaths) {
miscFiles
.AddRange(new DirectoryInfo
(dirpath
).GetFiles(searchPattern
: "*", searchOption
: SearchOption
.TopDirectoryOnly)); }
foreach (FileInfo miscFile in miscFiles) {
bool isNotFound = (romFiles.FirstOrDefault((FileInfo f) => comparisonPredicate(f, miscFile)) == null);
if ((isNotFound)) {
// Enviar el archivo a la papelera de reciclaje:
Vb.FileIO.FileSystem.DeleteFile(miscFile.FullName, Vb.FileIO.UIOption.OnlyErrorDialogs, Vb.FileIO.RecycleOption.SendToRecycleBin);
// O eliminarlo permanentemente:
// miscFile.Delete();
}
}
}
}
VisualBasic.NET:
Imports System;
Imports System.Collections.Generic;
Imports System.IO;
Imports System.Linq;
Imports Microsoft.VisualBasic
Public NotInheritable Class RomUtil
Public Shared ReadOnly romsPath As String = "C:\...carpeta de las roms\"
Public Shared ReadOnly miscPaths As String() = {
"C:\...carpeta de las imágenes\",
"C:\...carpeta de los videos\",
"etc..."
}
Private Sub New()
End Sub
Public Shared Sub CleanRoms()
Dim comparisonPredicate As Func(Of FileInfo, FileInfo, Boolean) =
Function(ByVal a As FileInfo, ByVal b As FileInfo)
Return Path.GetFileNameWithoutExtension(a.Name).Equals(Path.GetFileNameWithoutExtension(b.Name), StringComparison.OrdinalIgnoreCase)
End Function
Dim romFiles As IEnumerable(Of FileInfo) =
New DirectoryInfo(romsPath).GetFiles("*", SearchOption.TopDirectoryOnly)
Dim miscFiles As New List(Of FileInfo)
For Each dirpath As String In miscPaths
miscFiles.AddRange(New DirectoryInfo(dirpath).GetFiles("*", SearchOption.TopDirectoryOnly))
Next
For Each miscFile As FileInfo In miscFiles
Dim isNotFound As Boolean =
(romFiles.FirstOrDefault(Function(f As FileInfo) comparisonPredicate(f, miscFile)) Is Nothing)
If (isNotFound) Then
' Enviar el archivo a la papelera de reciclaje:
FileIO.FileSystem.DeleteFile(miscFile.FullName, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
' O eliminarlo permanentemente:
' miscFile.Delete()
End If
Next
End Sub
End Class
Saludos!