Renombrador masivo

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Renombrador masivo

Mensaje por avechuche »

Bueno, yo de nuevo .. resulta que quiero hacer un renombrador masivo... digamos tengo una carpeta con "x" cantidad de archivos o carpetas a los cuales le quiero cambiar de nombre. Y tengo un ".txt" aparte con los nombres que les quiero poner a esos archivos/carpetas. A considerar. Que si la cantidad de archivos o carpetas es diferente a la cantidad de nombres del ".txt" (un nombre por linea), que el programa no haga nada. Tengo el siguiente codigo pero no me funciona :S. a ver si me pueden ayudar ...

Código: Seleccionar todo

#include <file.au3>

$carpeta = @ScriptDir & "\gonzalo\" ;
$txt = "nombres.txt" ; 

$total_lineas = _FileCountLines($txt)
$total_archivos = _FileListToArray($carpeta)

If $total_lineas = $total_archivos[0] Then
	For	$s = 1 To $total_lineas
		$linea = FileReadLine($txt, $s)
		FileMove($linea, "nuevo_nombre_" & $s, 1)
	Next
EndIf
No se que tengo mal... Gracias!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Renombrador masivo

Mensaje por Chefito »

Que error te da?
Puedes comprobar si alguna función te da error con @error.
Mira a ver si entra en el if. Puede que sin querer tengas más líneas que archivos por culpa de un salto de línea o un retorno de carro.
Ten cuidado con los path de los archivos no sea que alguna función lo necesite.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Renombrador masivo

Mensaje por avechuche »

Osea error ninguno, no me renombra las cosas :S
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Renombrador masivo

Mensaje por gna08 »

Jajaja te viniste al foro, Jajaja, bue estoy casi seguro q el error es el siguiente, en la línea el txt sólo aparece el nombre del archivo a renombrar, entonces al usar la función filemove y leer el nombre y al no especificarse la ruta del mismo pues usa la carpeta del script en este caso, y como cálculo que al script lo estas ejecutando en una carpeta diferente a la de los archivos, al buscar era línea para mover, no la encuentra,
a ver si usas la lógica y pensás donde va lo que te acabó de explicar.
Saludos
Aunk no m Buskes, Seguro m enkontras!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Renombrador masivo

Mensaje por Ximorro »

Totalmente de acuerdo con lo del path, pero además lo estás haciendo al revés.
En FileMove usas de origen los nombres en el archivo txt, con lo que estás usando esos nombres como los que hay que cambiar, no como los nombres A los que hay que cambiar...

Al primer nombre en nombres.txt lo renombras como "nuevo_nombre_1", pero si en \Gonzalo (suponiendo que encuentras el path) no hay ningún archivo con ese nombre no lo cambiará...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Renombrador masivo

Mensaje por avechuche »

Código: Seleccionar todo

#include <file.au3>


$txt = @ScriptDir&"\nombres\nombres.txt"
$abrirtxt = FileOpen($txt, 0)
$cantlineastxt = _FileCountLines($txt)
$archivos = @ScriptDir&"\archivos\"
$destino = @ScriptDir&"\Copias\"


	For	$s = 1 To $cantlineastxt
		$linea = FileReadLine($abrirtxt, $s)
		FileMove($archivos&"***"&".***", $destino&$linea&".***")
	Next
Sigo con el problemita este ... creo que me falta un poco nada mas .. como le indico al autoit que el la primera linea q lee del .txt ($txt) es el nombre que le debe poner al primer archivo que encuentra dentro de "$archivos" y asi sucesivamente, el 2 con el 2, etc etc etc ... gracias!
jonathan7
Mensajes: 10
Registrado: 27 Feb 2010, 02:47

Respuesta posible

Mensaje por jonathan7 »

Por que no pruebas con _FileRename() esta en este foro es una actualizacion a la libreria file si no lo encuentras te lo dejo.

Código: Seleccionar todo

Func _FileRename($file,$NewName)
   Local $paht,$name,$a=0
   If FileExists($file) Then
	   Do
		  $paht=Stringmid($file,Stringlen($file)-$a,1)
		  $a+=1
	   Until $paht="\"

	   $paht=Stringmid($file,1,Stringlen($file)-$a)
	   $name=StringRight($file,$a-1)
	   $result = Run(@ComSpec & ' /c RENAME "' & $name & '" "' & $NewName & '"',$paht,@SW_HIDE, 6)

	   While 1
		  $line = StderrRead($result)
		  If @error Then ExitLoop
		  ConsoleWriteError("! _FileRename  Error:" &  @cr & "-->" & $line & @cr)
		  Return $line
	  Wend
	  Return 1
  Else
	  Return 0
  EndIf
EndFunc   ;==>_FileRename
Con esto no tendrás que mover nada usaras la dirección del archivo original y le pondrás el nuevo nombre que esta en tu .txt
$file = es la direccion path
$NewName = nuevo nombre

por ejemplo si la direccion del archivo original es $file ="C:\uno.txt" y el $NewName = "dos.txt"
terminara con "C:\dos.txt"
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Renombrador masivo

Mensaje por avechuche »

Ibamos bien hasta aca ...
"por ejemplo si la direccion del archivo original es $file ="C:\uno.txt" y el $NewName = "dos.txt"
terminara con "C:\dos.txt"... lo que yo quiero es lo siguiente ...
Supongamos que tengo una carpeta que tiene 10 archivos (10 archivos diferentes conm cualquier nombre) y tengo un (.txt) con 10 lineas (son los nombres que le quiero poner a esos 10 archivos). Quiero lo siguiente, que lea la primer linea del .txt y ponga eso al primer archivo. Ejemplo

Tengo 2 fotos (foto1.jpg y foto2.jpg) y en el archivo de texto q se llama (nombres.txt) tengo en la primer linea "autos" y en la segunda "perros". Entonces ... quiero que mi archivo "foto1.jpg" pase a llamarse "autos" y la "foto2.jpg" pase a llamarse "perros"
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Renombrador masivo

Mensaje por Chefito »

Para conseguir los nombres de archivos de un directorio puedes utilizar la función FileFindFirstFile. Mira su ejemplo y adaptalo un poquito para renombrar los archivos. También puedes utilizar la función _FileListToArray. Esta función almacena los nombres de los archivos en un array (matriz).

Ves cogiendo las líneas del archivo y los nombres de los archivos a cambiar de la carpeta, y cambiale el nombre uno a uno con un simple bucle for o while.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Renombrador masivo

Mensaje por Ximorro »

Y ojo con eso de "el primer archivo". No hay nada en la ayuda que indique que esto ordene de alguna manera especial. Por pruebas que hice parece que lo ordenaba alfabéticamente, pero no puedes estar seguro si en la ayuda no lo especifican.
También tienes que tener cuidado porque también te devuelve directorios, aunque eso lo puedes arreglar con la máscara, si pones "*.*" normalmente no saldrán directorios, porque no tienen extensión (aunque tampoco saldrán archivos que no tengan extensión).

Para asegurarse del todo se podría usar FileGetAttrib, que entre otras cosas te dirá si es directorio. Quizás haya otra función más directa pero no la conozco.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Renombrador masivo

Mensaje por avechuche »

Lo logre ... gracias por su ayuda ... estoy mejorando para que tmb renombre carpetas ...
Responder