elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  renombrar ficheros con distintos nombres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: renombrar ficheros con distintos nombres  (Leído 4,425 veces)
500DRIFT

Desconectado Desconectado

Mensajes: 3


Ver Perfil
renombrar ficheros con distintos nombres
« en: 7 Agosto 2022, 23:36 pm »

Hola a todos
soy nuevo en esta pagina
estoy aprendiendo Bach ya que me gusta la informática.
tengo una duda con un Bach que  con lo que he ido leyendo en este foro y en otros sitios he conseguido.
Me gustaría que me ayudarais o que me pudierais guiar en lo que pudierais sobre el Bach que he creado.
Estoy intentando crearme un .bat para cambiar los nombres de los capítulos de una seri teniendo un txt con la lista.
Lo que en este bat intento hacer es hacer una lista con los nombres que están puestos en la carpeta
Ej:
prueba    prueba2
capitulo1           capitulo nuevo 1
capitulo2           capitulo nuevo 2
capitulo3           capitulo nuevo 3

y en el txt que tengo los nuevos nombres (todos diferentes claro)

mi bach es este:

dir /b > prueba.txt

@echo off
for /f "tokens=*" %%x in ('type prueba.txt') do (echo ren "%%x") >> prueba1.tmp
for /f "tokens=*" %%x in ('type prueba2.txt') do (echo "%%x") >> prueba2.tmp

Setlocal EnableDelayedExpansion
set archorig=prueba1.tmp
set archorig1=prueba2.tmp
set archdest=total.txt
for /F "tokens=*" %%a in (%archorig% %archorig1%) do (
rem: %%a
   set lin=%%a
   echo !lin!>>%archdest%
   echo.
)
echo.
del *.tmp
pause>nul

goto:eof

El resultado es primero la lista y luego los nombres nuevos pero con los cambios.

EJ:

ren "capitulo1"
ren "capitulo2"
ren "capitulo3"
"capitulo nuevo 1"
"capitulo nuevo 2"
"capitulo nuevo 3"

Alguien podría decirme que hago mal, ya que lo que necesitaría seria

ren  "capitulo1" "capitulo nuevo 1"
ren  "capitulo2" "capitulo nuevo 2"
ren  "capitulo3" "capitulo nuevo 3"

Muchas gracias


« Última modificación: 8 Agosto 2022, 00:03 am por 500DRIFT » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.041



Ver Perfil
Re: renombrar ficheros con distintos nombres
« Respuesta #1 en: 9 Agosto 2022, 00:40 am »

Pues nop, el bucle For abre los archivos en serie (primero uno y luego el otro), en ejemplo veo que piensas que lo hace en paralelo (ambos a la vez)

Código
  1. for /F "tokens=*" %%a in (%archorig% %archorig1%) do (

Básicamente entiendo que quieres abrir dos archivos de texto a la vez y trabajar línea a línea de cada uno, eso es algo complejo de hacer en Batch, tienes que usar Buffers para esto, en uno depositas el contenido de un archivo y en otro lo del otro archivo

No sé que tanto hayas avanzado en tu entrenamiento de Batch pero tendrías que tener claro los Redireccionamientos para luego hacer un uso avanzado de ellos en Buffers

Conceptos rápidos:

- Hay tres manejadores utilizados en Batch:
STDIN = 0 Entrada por teclado
STDOUT = 1 Salida normal por pantalla
STDERR = 2 Salida de errores por pantalla

-- Luego estás los otros manejadores del 3 al 9 que no se utilizan y que se pueden aprovechar para otros fines

- Hay dos redireccionadores de entrada y salida: > para redireccionar Salidas y < para redireccionar Entradas

- Redireccionar la salida de un comando a un archivo: como se espera que la redirección será del STDOUT (1 Salida normal por pantalla) resultante de ejecutar un comando sin errores se sobreentiende el 1, el siguiente ejemplo muestra dos líneas que hacen exactamente lo mismo:

Código
  1. Echo Hola mundo >archivo.txt
  2. Echo Hola mundo 1>archivo.txt

- Redireccionar la salida de varios comandos a un archivo, todas las secciones son equivalentes:

Código
  1. (Echo Hola mundo
  2. Echo esta es la linea dos
  3. Echo y esta la linea tres) >archivo.txt
  4.  
  5.  
  6. (
  7.  Echo Hola mundo
  8.  Echo esta es la linea dos
  9.  Echo y esta la linea tres
  10. ) >archivo.txt
  11.  
  12.  
  13. (
  14.  Echo Hola mundo
  15.  Echo esta es la linea dos
  16.  Echo y esta la linea tres
  17. ) 1>archivo.txt
  18.  
  19.  
  20. >archivo.txt (
  21.  Echo Hola mundo
  22.  Echo esta es la linea dos
  23.  Echo y esta la linea tres
  24. )
  25.  
  26.  
  27. 1>archivo.txt (
  28.  Echo Hola mundo
  29.  Echo esta es la linea dos
  30.  Echo y esta la linea tres
  31. )

- Escribir la primera línea de un archivo a una variable, se usa Set /P "variable=" para que se reciba por teclado el contenido de variable, entonces se puede redireccionar el contenido de un archivo a STDIN (0 Entrada por teclado), como se espera entrada por teclado se sobreentiende que se utilizará el manejador 0, el siguiente ejemplo muestra dos líneas que hacen lo mismo:

Código
  1. Set /P "variable=" <archivo.txt
  2. Set /P "variable=" 0<archivo.txt

---

Bien, ahora para hacer tu ejercicio hay que usar un manejador no utilizado por Batch, ahí tienes disponibles del 3 al 9, el For /F ya es capaz de manejar línea a línea un archivo, solo falta tener a la mano otro archivo más en un Buffer que será justo un manejador al que se le redireccionará el contenido del otro archivo.

Paso 1, tenemos estos archivos:

prueba.txt
Código:
ren "capitulo1"
ren "capitulo2"
ren "capitulo3"

prueba1.txt
Código:
"capitulo nuevo 1"
"capitulo nuevo 2"
"capitulo nuevo 3"

Paso 2, el script sería:

Código
  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. 3<prueba2.txt (
  4.  For /F "tokens=*" %%i In (prueba.txt) Do (
  5.    0<&3 Set /P "lin="
  6.    Echo %%i !lin!
  7.  )
  8. ) >total.txt

- En la línea 3 se redirecciona el contenido de prueba2.txt al manejador 3, luego va el comando a ejecutar, en este caso como serán varias instrucciones se agrupa todo entre paréntesis, al final en la línea 8 se redirige todo el resultante al archivo total.txt

- En la línea 5 se redirecciona el contenido del manejador (buffer) 3 al 0 (teclado) para que sea utilizado por el Set /P (primera línea), con cada iteración se van consumiendo una a una las líneas de buffer

Paso 3, el archivo total.txt quedaría:

Código:
ren "capitulo1" "capitulo nuevo 1"
ren "capitulo2" "capitulo nuevo 2"
ren "capitulo3" "capitulo nuevo 3"

---
Referencias: https://codeutility.org/windows-how-can-two-text-files-be-read-in-parallel-by-a-batch-file-stack-overflow/

Material recomendado:

Tutorial de Programación Batch (Nikos3194, 2013)
https://sites.google.com/site/nikos3194rfcindex/Tutorial%20de%20programacion%20Batch%20%5Bfinal%5D.pdf

Programación BATCH Avanzada (Sirdarckcat, 2006)
https://foro.elhacker.net/dlattach.html;topic=132924.0;attach=1858

Windows Command Reference 2011
https://download.microsoft.com/download/7/2/9/729BB069-C0B9-4C68-9245-0ED23C11B6ED/WinCmdRef.chm

SS64 Command line OS Scripting references (CMD Reference)
https://ss64.com/nt/


En línea

500DRIFT

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: renombrar ficheros con distintos nombres
« Respuesta #2 en: 9 Agosto 2022, 19:18 pm »

Buenas tardes

Gracias EdePC por la explicación, veo que me queda mucho camino por recorrer.

Tu explicación no podía ser mas detallada, me pondré con el material que me has recomendado ya que quiero aprender mas sobre Bach.

De nuevo muchas gracias y cuando tenga todo el código lo expondré con los ejemplos, espero que ha alguien mas le pueda ayudar.

Un saludo
« Última modificación: 10 Agosto 2022, 20:01 pm por 500DRIFT » En línea

500DRIFT

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: renombrar ficheros con distintos nombres
« Respuesta #3 en: 12 Agosto 2022, 00:09 am »

Buenas noches

Os traigo el Bach explicado por partes que he acabado gracias a EdePC
archivo-> inicio.txt lista inicial
capitulo1
capitulo2
capitulo3
archivo-> final.txt nombres que quedaran al final
capitulo nuevo 1
capitulo nuevo 2
capitulo nuevo 3

Añadimos ren y comillas a nuestra lista inicial
Código
  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. for /f "tokens=*" %%x in ('type inicio.txt') do (echo ren "%%x") >> inicio.tmp
  4. timeout /t 1
  5.  
Sustituimos las vocales que tienen tildes
Código
  1. set acentos=0
  2. if %acentos% == 0 (goto cambiar_tildes) ELSE (goto pause)
  3. :cambiar_tildes
  4. for /F "tokens=*" %%b in (final.tmp) do (
  5. set vocales=%%b
  6. set vocales=!vocales:á=a!
  7. set vocales=!vocales:é=e!
  8. set vocales=!vocales:í=i!
  9. set vocales=!vocales:ó=o!
  10. set vocales=!vocales:ú=u!
  11. Echo !vocales!>>final1.tmp
  12. )
  13. :pause
  14. timeout /t 1
  15.  
Añadimos la numeración de los capítulos
Código
  1. set cont1=1
  2. for /f "tokens=*" %%a in ('type final1.tmp') do (
  3. if !cont1! GTR 9 (echo !cont1!.-%%a>> final2.tmp) ELSE (echo 0!cont1!.-%%a>> final2.tmp)
  4. set /a cont1+=1
  5. )
  6. timeout /t 1
  7.  
Elegimos que extensión si mp4 o mkv
Código
  1. findstr "*.mp4" inicio.txt
  2. if errorlevel == 0 (goto Funcion1) ELSE (goto Funcion2)
  3.  
  4. :Funcion1
  5. for /f "tokens=*" %%L in ('type final2.tmp') do (echo "%%L.mp4") >> final3.tmp
  6. timeout /t 1
  7. goto union
  8.  
  9. :Funcion2
  10. for /f "tokens=*" %%L in ('type final2.tmp') do (echo "%%L.mkv") >> final3.tmp
  11. timeout /t 1
  12.  
  13. :union
  14.  
Final3.tmp lo insertamos en inicio.txt
Código
  1. 3<final3.tmp (
  2.  For /F "tokens=*" %%i In (inicio.tmp) Do (
  3.    0<&3 Set /P "lin="
  4.    Echo %%i !lin!
  5.  )
  6. ) >cambio.txt
  7.  
  8. Setlocal DisableDelayedExpansion
  9.  
  10. timeout /t 1
  11.  
Cambiamos la extensión para convertirlo en bat, ejecutarlo y borrar los archivos creados
Código
  1. ren cambio.txt cambio.bat
  2. timeout /t 1
  3. call cambio.bat
  4. timeout /t 1
  5. del *tmp
  6. del final.txt
  7. del inicio.txt
  8. del cambio.bat
  9.  
  10. echo ---El cambio se realizado correctamente---
  11.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[vbscript]¿como renombrar un grupo de ficheros? SOLUCIONADO
Scripting
tonilogar 8 14,860 Último mensaje 18 Octubre 2009, 01:27 am
por Novlucker
[C] Problema con nombres de ficheros
Programación C/C++
JJShadiw 3 2,481 Último mensaje 24 Diciembre 2010, 00:22 am
por dooque
Renombrar ficheros
Windows
drp60343 1 2,132 Último mensaje 19 Agosto 2014, 13:35 pm
por Eleкtro
renombrar y reubicar archivos en funcion de los nombres de este
Software
seu230 0 839 Último mensaje 3 Enero 2016, 08:22 am
por seu230
[CMD] script copiar y renombrar varios ficheros
Scripting
Mendozak47 1 3,057 Último mensaje 7 Febrero 2018, 22:21 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines