Batch que borre el título de los MKV de forma masiva y en todos los subdirectorios

He modificado un batch para que me borre los títulos de todos los mkv de forma masiva, pero no se mucho de esta forma de programar.

echo ***** Starting MKVtitle *****
for %%m in (*.mkv) do (
echo Changing %%m Title to "%%nm"
"C:\Program Files\MKVToolNix\mkvpropedit" "%%m" -e info -s title="%%nm"
echo -----
)
echo ***** Finished *****

Este batch en teoría cambiaba los títulos y los ponía igual que los nombres de los archivos, pero no cumplía con el cometido, ponía de título %nm en todos los archivos, así que directamente dejé title en blanco y lo que hacía era borrar los títulos:

echo ***** Starting MKVtitle *****
for %%m in (*.mkv) do (
echo Changing %%m Title to "%%nm"
"C:\Program Files\MKVToolNix\mkvpropedit" "%%m" -e info -s title=""
echo -----
)
echo ***** Finished *****

Esto me sirve, pero dentro de este subdirectorio tengo muchos subdirectorios, como 160, y cada subdirectorio tiene mkv, necesitaría que este batch actuara también en los archivos de esos subdirectorios. He intentado hacerlo así, pero me faltan cosas que no se como escribir:

echo ***** Starting MKVtitle *****
dir /ad /b > carpetas.txt
For /f “delims=” %n in (carpetas.txt) do(
for %%m in (*.mkv) do (
echo Changing %%m Title to "%%nm"
"C:\Program Files\MKVToolNix\mkvpropedit" "%%m" -e info -s title=""
Echo -----
)
)
echo ***** Finished *****

A ver si alguien me puede echar un cable

Respuesta

Fijate si esto te sirve.

Cómo renombrar ficheros en lote (o solo una parte del mismo) según un patrón (incluso en varias subcarpetas)

Supongamos que tienes varios ficheros en distintas carpetas y todos ellos tienen algo en común, por ejemplo, contienen en el nombre del fichero la palabra textobuscado, y se quiere sustituir por textoqueponer.

Los pasos para hacerlo son (se puede hacer en cualquier versión de Windows 7, Windows 8, Windows 10 y posteriores):

  1. Abrir PowerShell (la manera más rápida es dale al botón de inicio y teclea directamente Powershell). Windows PowerShell es un intérprete avanzado de comandos (parecido a MS-DOS pero más potente, disponible a partir de Windows XP Service Pack 2) y aunque da un cierto reparo y rechazo usarlo si no te gustan los comandos, verás cómo es muy fácil de usar. Solo hay que copiar y pegar ahí.
  1. Cambia al directorio donde estén los ficheros, por ejemplo, si están en la carpeta de documentos, teclea “cd documentos” (al escribir docum se puede pulsar la tecla del tabulador y lo autocompleta con el valor correcto). Si está en Documentos subcarpeta trabajos teclea cd documentos\trabajos (por ejemplo).
  1. Teclea (o pega) el comandoGet-ChildItem -Filter “*textobuscado*” -Recurse | Rename-Item -NewName {$_. Name -replace “textobuscado”,”textoqueponer” }

(suponiendo que textotextobuscado sea la cadena a buscar, y textoqueponer la que hay que poner). Si no es así, cámbialos por los valores que quieras.

Windows PowerShell para cambiar el nombre en lote a ficheros

  1. Pulsa enter y pasados unos segundos, se habrán cambiado todos, tanto de ese directorio, como de los subdirectorios.

Las partes del comando y lo que hacen cada una de ellas, son:

Get-ChildItem -Filter “*textobuscado*”
Busca todos los ficheros que contengan la cadena “textobuscado” en el nombre.

-Recurse
Si se indica este parámetro, el anterior busca de manera recursiva en todos los subdirectorios (subcarpetas) a partir de la ruta actual en la que se encuentra.

 |
Le indica a PowerShell que le pase cada uno de los objetos que encuentra en el primer comando (Get-ChildItem) y se lo pase al segundo comando (Rename-Item)

Rename-Item
Como su nombre indica, cambia el nombre del objeto.

{$_.name -replace “textobuscado”,”textoqueponer” }
Le indica al comeando Rename-Item que busque textobuscado y lo sustituya por textoqueponer. Si se quiere eliminar simplemente la parte del nombre con la cadena “textobuscado”, solo habría que sustituirlo por “”.

Un parámetro interesante que se puede usar es –Whatif al final del comando. De esta manera, el sistema presenta una relación de los nombres de los ficheros que se van a cambiar y cómo van a quedar sin llegar a hacerlo.

Get-ChildItem -Filter “*textobuscado*” -Recurse | Rename-Item -NewName {$_.name -replace “textobuscado”,”textoqueponer” } -Whatif

En caso de que ya exista el fichero, da error ya que no deja cambiarle el nombre (pues sobreescribiría al actual): Rename-Item : No se puede crear un archivo que ya existe.

Por supuesto, se puede complicar más el resultado con otros comandos, combinaciones o filtros (recomiendo usar el comando Get-command y Get-help), pero para cambiar en lote el nombre de un grupo de ficheros según un patrón, funciona perfectamente y es muy cómodo.

Es más complicado explicarlo que hacerlo. Si simplemente copias y pegas el comando sustituyendo las cadenas a buscar y por la que hay que sustituirlas por lo que quieres hacer, verás qué fácil es cambiar los nombres de ficheros en lote incluso en subcarpetas.

No olvides de comentar y valorar la respuesta.

Veo que esto lo que hace es cambiar el nombre del archivo, yo lo que necesito es cambiar el TITULO de los metadatos del MKV.

De todas formas, gracias ;)

Ok creí que con decir el título del MKV te referías al nombre del archivo MKV

2 respuestas más de otros expertos

Respuesta
2

He dado con la solución. El batch simplemente debe contener esto, crea una lista con todos los ficheros mkv que hay (directorio actual y subdirectorios), va cambiando el título uno a uno y luego borra el listado:

dir/b/s *.mkv >list.txt
for /F "delims=;" %%F in (list.txt) do "C:\Program Files\MKVToolNix\mkvpropedit" "%%F" --edit info --set "title=%%~nF"
del list.txt
Respuesta
1

Aunque estoy de acuerdo con favio en que PowerShell es mucho más potente que MSDOS y las pocas veces que he tenido que usarlo para resolver algo que no conseguía con MSDOS siempre lo he conseguido, soy un usuario novato de esa shell y no me atrevo a sugerir nada en ese terreno.

Pero en MSDOS soy algo más atrevido y voy a intentar echarte una mano. Prueba con esto:

@echo off
echo ***** Starting MKVtitle *****
for /f %%m in ('dir /s /b *.mkv') do (
echo Changing %%m Title to "%%~nm"
"C:\Program Files\MKVToolNix\mkvpropedit" "%%m" -e info -s title="%%~nm"
Echo -----
)
echo ***** Finished *****

Aunque previamente te sugeriría que precedieras el comando de cambio (el del mkvpropedit, que desconozco pero supongo que es el que debe cambiar el título) de un "echo" antes de ejecutarlo para poder ver previamente si va a hacer lo que quieres.

Por supuesto el bat debe estar en la carpeta base de la que cuelgan todas las que tienen archivos mkv.

Parece que recorre todos los subdirectorios y archivos, pero toma mal los nombres. Te pongo una linea:

El subdirectorio en este caso es "Casual T1 [HD]" y el nombre del archivo es "Casual 1x01 [720p]"

Viendo como va actuando, toma como nombres solo la primera palabra y cuando ve un espacio se para y ya no coge más texto para el nombre y pasa al siguiente. No se como se puede arreglar esto.

Aunque veo que has encontrado una solución, lo que habría que cambiar en mi propuesta serían algunos parámetros del comando FOR utilizado. Quedaría así:

@echo off
echo ***** Starting MKVtitle *****
for /f "tokens=* delims=" %%m in ('dir /s /b *.mkv') do (
echo Changing %%m Title to "%%~nm"
"C:\Program Files\MKVToolNix\mkvpropedit" "%%m" -e info -s title="%%~nm"
Echo -----
)
echo ***** Finished *****

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas