Buenos días
Soy nuevo en esto, y la verdad que ando bastante pez.
Me estoy intentando hacer un script que ejecute algunas operaciones sobre ficheros seleccionados en una carpeta,
por ejemplo copiarlos a una ruta especificada al teclear yo "copy" o renombrarlos ponerles etiquetas al teclear "ren".
Lo ando mirando con los comandos "selectfile" y "copyfile", pero sólo se hacerlo si meto mis ficheros a una carpeta de origen fija, o operando con todos los ficheros de una carpeta, pero no con los que yo tenga seleccionados
Agradecería si me pudierais echar un cable
Mil gracias
txema
Operaciones con archivos seleccionados: copiar, renombrar
Moderator: Flipeador
Re: Operaciones con archivos seleccionados: copiar, renombrar
Hola, no existe ningún comando selectfile o copyfile, me imagino que te refieres a FileSelectFile (que no sirve para lo que quieres hacer) y FileCopy respectivamente.
Una vez que hayas seleccionado los archivos en el explorador de archivos, utiliza el comando SendInput para presionar la tecla CTRL+C para copiar los archivos en selección, luego recuperas estos archivos mediante el portapapeles (Clipboard).
Por ejemplo:
El script de arriba copia los archivos seleccionados y te los muestra en un mensaje. Cada archivo está separado por una nueva línea, utiliza Loop Parse y FileCopy.
Una vez que hayas seleccionado los archivos en el explorador de archivos, utiliza el comando SendInput para presionar la tecla CTRL+C para copiar los archivos en selección, luego recuperas estos archivos mediante el portapapeles (Clipboard).
Por ejemplo:
Code: Select all
SendInput ^c
Sleep 500
MsgBox % Clipboard
Re: Operaciones con archivos seleccionados: copiar, renombrar
Muchas gracias Flipeador
efectivamente me refiero a esos comandos que dices, los puse al revés
Ya veo entonces que "Clipboard" me sirve de variable para que haga las operaciones con los ficheros seleccionados, supongo que el comando sería mas o menos
"FileCopy, Clipboard, C:\Destino deseado"
¿Como haría para que eso me lo haga si pulso por ejemplo ctrl+1?
(mi idea es tener varios destinos definidos con atajos ctrl+1, ctrl+2...)
Un saludo y gracias de nuevo
efectivamente me refiero a esos comandos que dices, los puse al revés
Ya veo entonces que "Clipboard" me sirve de variable para que haga las operaciones con los ficheros seleccionados, supongo que el comando sería mas o menos
"FileCopy, Clipboard, C:\Destino deseado"
¿Como haría para que eso me lo haga si pulso por ejemplo ctrl+1?
(mi idea es tener varios destinos definidos con atajos ctrl+1, ctrl+2...)
Un saludo y gracias de nuevo
Re: Operaciones con archivos seleccionados: copiar, renombrar
Añade la línea LCtrl & 1:: al principio del código anterior, y añade el siguiente código al final:
Code: Select all
Loop, Parse, Clipboard, `n, `r
FileCopy % A_LoopField, C:\Destino deseado, 1 ; 1 = Sobreescribir
Return
Re: Operaciones con archivos seleccionados: copiar, renombrar
Muchas gracias de nuevo
Voy a ver si lo apaño
Un saludo
Voy a ver si lo apaño
Un saludo
Re: Operaciones con archivos seleccionados: copiar, renombrar
Ya he montado el script gracias a tu ayuda Flipeador, me funciona perfecto, lo único que no veo la barra de progreso de windows cuando copia un archivo, no sé si será posible. Yo utilizo "Teracopy" para la copia, y al no salirme nada no sé si lo hace con el estándard de windows o con teracopy.
También tengo que investigar como crear un log que me registre los archivos de los que he hecho copia y/o que les pueda poner etiquetas
(por ejemplo para cada fichero seleccionado crear un txt con nombre "*-copiado a destino 1.log" "-copiado a destino 2.log" (* sería el nombre original))
Muchas gracias de nuevo
También tengo que investigar como crear un log que me registre los archivos de los que he hecho copia y/o que les pueda poner etiquetas
(por ejemplo para cada fichero seleccionado crear un txt con nombre "*-copiado a destino 1.log" "-copiado a destino 2.log" (* sería el nombre original))
Muchas gracias de nuevo
Code: Select all
MsgBox, Selecciona los archivos que quieres copiar. Pulsa Ctrl+1 para enviar los archivos seleccionados al destino 1, Pulsa Ctrl+2 para enviar los archivos seleccionados al destino 2
LCtrl & 1::
SendInput ^c
Sleep 500
MsgBox % Clipboard
Loop, Parse, Clipboard, `n, `r
FileCopy % A_LoopField, Y:\Pruebas AutoHotkeys\Destino 1
Return
LCtrl & 2::
SendInput ^c
Sleep 500
MsgBox % Clipboard
Loop, Parse, Clipboard, `n, `r
FileCopy % A_LoopField, Y:\Pruebas AutoHotkeys\Destino 2
Return
Re: Operaciones con archivos seleccionados: copiar, renombrar
El comando FileCopy no utiliza ninguna interfaz, si quieres una interfaz la tienes que crear tu mismo. TeraCopy solo modifica el menú contextual, eso no hace que cualquier aplicación que vaya a copiar un archivo se vea obligada a hacerlo mediante TeraCopy. Si quieres copiar los archivos con TeraCopy tienes que utilizar el comando Run y media pasar los archivos por la línea de parámetros.
Para crear un registro de los archivos copiados utiliza el comando FileAppend dentro del Loop Parse, para ello agrega llaves { }. Mira los ejemplos en la documentación. Además, el comando FileCopy establece la variable incorporada ErrorLevel en verdadero (TRUE - valor distinto de cero) si hubo un error al copiar el archivo, que puedes utilizar en el registro.
Busca estos comandos y la variable en la documentación, mira los ejemplos e intenta implementar todo en tu Script, me comentas.
Para crear un registro de los archivos copiados utiliza el comando FileAppend dentro del Loop Parse, para ello agrega llaves { }. Mira los ejemplos en la documentación. Además, el comando FileCopy establece la variable incorporada ErrorLevel en verdadero (TRUE - valor distinto de cero) si hubo un error al copiar el archivo, que puedes utilizar en el registro.
Busca estos comandos y la variable en la documentación, mira los ejemplos e intenta implementar todo en tu Script, me comentas.
Re: Operaciones con archivos seleccionados: copiar, renombrar
Gracias de nuevo
Voy a mirar el FileAppend. El Loop y sus modificadores todavía no los entiendo muy bien, quiero estudiármelo también, a ver que me están haciendo en el script anterior
Un saludo
Voy a mirar el FileAppend. El Loop y sus modificadores todavía no los entiendo muy bien, quiero estudiármelo también, a ver que me están haciendo en el script anterior
Un saludo
Re: Operaciones con archivos seleccionados: copiar, renombrar
ya he visto mas o menos aunque no es exactamente lo que busco, me almacena en un log.txt los archivos de los que voy haciendo copia.
Lo malo es que no me hace salto de línea y me pone la ruta completa.
Tengo que seguir investigando, yo lo que quiero que me pongo solo el nombre (sin la ruta) y uno encima de otro, ahí vamos poco a poco
Gracias de nuevo
Lo malo es que no me hace salto de línea y me pone la ruta completa.
Tengo que seguir investigando, yo lo que quiero que me pongo solo el nombre (sin la ruta) y uno encima de otro, ahí vamos poco a poco
Gracias de nuevo
Code: Select all
MsgBox, Selecciona los archivos que quieres copiar: `n Pulsa Ctrl+1 para enviar los archivos seleccionados al destino 1 `n Pulsa Ctrl+2 para enviar los archivos seleccionados al destino 2
;Lanza una ventana con las instrucciones del script `n hace salto de línea
LCtrl & 1:: ; al pulsar Ctrl+1 se autoteclea Ctrl c (con lo que copia lo que tengamos seleccionado), y nos lo pone en una ventana
SendInput ^c
Sleep 500
MsgBox % Clipboard
Loop, Parse, Clipboard, `n, `r
{
FileCopy % A_LoopField, Y:\Pruebas AutoHotkeys\Destino 1
FileAppend, % A_LoopField, log.txt
}
Return
Re: Operaciones con archivos seleccionados: copiar, renombrar
Utiliza el comando SplitPath con la variable A_LoopField para recuperar el nombre del archivo en otra variable. Para indicar un salto de línea añade la cadena `r`n. Por ejemplo: FileAppend % Variable . "`n", log.txt.
Re: Operaciones con archivos seleccionados: copiar, renombrar
Por cierto, aquí tienes la sintaxis de la línea de parámetros de TeraCopy.
Por ejemplo: RunWait TeraCopy.exe Copy "%A_LoopField%" "Y:\Pruebas AutoHotkeys\Destino 1", si no funciona puedes probar a reemplazar TeraCopy.exe por la ruta completa al ejecutable, entre comillas.
Por ejemplo: RunWait TeraCopy.exe Copy "%A_LoopField%" "Y:\Pruebas AutoHotkeys\Destino 1", si no funciona puedes probar a reemplazar TeraCopy.exe por la ruta completa al ejecutable, entre comillas.
Re: Operaciones con archivos seleccionados: copiar, renombrar
Muchas gracias una vez mas.
Me estudio esos comandos y lo comento
Un saludo
Me estudio esos comandos y lo comento
Un saludo
Re: Operaciones con archivos seleccionados: copiar, renombrar
Bueno, más o menos ya está, con el log correcto y teracopy, lo único malo es que abre una ventana por cada fichero copiado, no copia todos de una operación.Flipeador wrote:Utiliza el comando SplitPath con la variable A_LoopField para recuperar el nombre del archivo en otra variable. Para indicar un salto de línea añade la cadena `r`n. Por ejemplo: FileAppend % Variable . "`n", log.txt.
Quizá me admita sacarlo fuera del Loop, voy a probarlo a ver. Mantengo el FileCopy en la reserva con ;
Cuales serían los comandos para renombrar ficheros? Por lo que he visto sería FileMove especificando la misma ruta de origen y destino
Muchísimas gracias Flipeador, estoy aprendiendo un montón
Code: Select all
MsgBox, Selecciona los archivos que quieres copiar: `n Pulsa Ctrl+1 para enviar los archivos seleccionados al destino 1 `n Pulsa Ctrl+2 para enviar los archivos seleccionados al destino 2 ;Lanza una ventana con las instrucciones del script `n hace salto de línea
LCtrl & 1:: ; al pulsar Ctrl+1 se autoteclea Ctrl c (con lo que copia lo que tengamos seleccionado), y nos lo pone en una ventana
SendInput ^c
Sleep 500
MsgBox % Clipboard
Loop, Parse, Clipboard, `n, `r
{
SplitPath, % A_LoopField, NombreArchivo ; extraigo el nombre del archivo (sin ruta) en la variable NombreArchivo
RunWait "C:\Program Files\TeraCopy\TeraCopy.exe" Copy "%A_LoopField%" "Y:\Pruebas AutoHotkeys\Destino 1" ;ejecuta Teracopy y copia cada archivo del clipboard a su destino
; FileCopy % A_LoopField, Y:\Pruebas AutoHotkeys\Destino 1
FileAppend, % NombreArchivo "`n", log.txt ; Hago un registro de los archivos copiados "`n" me hace salto de línea
}
Return
Re: Operaciones con archivos seleccionados: copiar, renombrar
Prueba este script (si TeraCopy no copia los archivos correctamente puedes intentar reemplazar UTF-16 por UTF-8 o CP0).:
Para mover los archivos utiliza el comando FileMove, tal cual lo has descrito. Para mover con TeraCopy solo hay que cambiar Copy por Move.
Code: Select all
LCtrl & 1:: ; tecla de acceso rápido LCTRL+1
SelText := GetSelectedText() ; recupera el texto/archivos seleccionado(s)
if (ErrorLevel) ; si ocurrió un error
Return
GetTempFileObj(FileName,,,,SelText) ; crea un archivo temporal con el contenido de «SelText»
MsgBox 1,, % FileName . "`n`n" . SelText ; muestra la ruta del archivo temporal y el texto recuperado
IfMsgBox Cancel
Return
; copia los archivos en la lista y elimina el archivo temporal
RunWait "C:\Program Files\TeraCopy\TeraCopy.exe" Copy "*%FileName%" "Y:\Pruebas AutoHotkeys\Destino 1" /OverwriteAll /Close
FileDelete % FileName
; crea el registro
Loop Parse, SelText, `n, `r
{
SplitPath % A_LoopField, FN
FileAppend % FN . "`r`n", log.txt
}
Return
; ========================================================================================
; FUNCIONES
; ========================================================================================
/*
Recupera el texto seleccionado mediante el uso del portapapeles.
Parámetros:
KeepInClip:
Si verdadero el contenido copiado se mantiene en el portapapeles. Si es falso el portapapeles se restaura a su contenido original; este es el valor por defecto.
Timeout:
El tiempo máximo a esperar a que el portapapeles contenga datos, en segundos. Por defecto espera 2 segundos.
Ejemplo:
F1:: MsgBox % GetSelectedText() . "`n`n" . ErrorLevel
*/
GetSelectedText(KeepInClip := FALSE, Timeout := 2)
{
local Content := "" ; almacena el texto seleccionado
, ClipSaved := ClipboardAll ; guarda una copia de todos los datos en el portapapeles
Clipboard := "" ; vacía el portapapeles
SendInput ^c ; envía CTRL+C (copiar)
ClipWait % Timeout ; espera «Timeout» segundos a que el portapapeles contenga datos de cualquier tipo
if ( !ErrorLevel ) ; si ClipWait tuvo éxito
Content := Clipboard ; guardamos el texto en «Content»
if ( ErrorLevel || !KeepInClip ) ; si ClipWait no tuvo éxito o «KeepInClip» es falso
Clipboard := ClipSaved
return Content
} ; https://github.com/flipeador/AutoHotkey/blob/master/Lib/sys/Clipboard.ahk
/*
Recupera un objeto de archivo temporal válido para escribir en él.
Parámetros:
FileName:
Recibe una cadena con la ruta al archivo.
DirName:
El directorio donde crear el nuevo archivo. Si es una cadena vacía, se utiliza A_Temp.
Prefix:
La cadena de prefijo. Esta cadena se añadirá al comienzo del nombre del archivo.
Unique:
Valor entero para ser utilizado en la creación del nombre de archivo temporal.
Si este valor es cero, la función intenta formar un nombre de archivo único usando la hora del sistema actual (A_Now).
Si el archivo ya existe, el número se incrementa en uno y las funcion prueba si este archivo ya existe. Esto continúa hasta que se encuentre un nombre de archivo único.
Content:
Especifica el contenido del archivo. Este parámetro puede ser un Array [puntero a los datos, tamaño de los datos].
Encoding:
Codificación con la que abrir el archivo. Por defecto es UTF-16.
Return:
Devuelve un objeto de archivo con permiso de escritura. El objeto devuelto no comparte ningún acceso (lectura, escritura, eliminación).
Ejemplo:
MsgBox % GetTempFileObj(FileName, A_Desktop,,, "Hola Mundo!") . FileName ; crea un archivo temporal en el escritorio
*/
GetTempFileObj(ByRef FileName := "", DirName := "", Prefix := "", Unique := 0, Content := "", Encoding := "UTF-16")
{
local FileObj := ""
DirName := DirName == "" ? A_Temp : DirName
Unique := Unique == 0 ? A_Now : Unique
loop
FileName := DirName . "\" . Prefix . Unique++ . ".TMP"
until ( !FileExist(FileName) && (FileObj := FileOpen(FileName,"w-rwd",Encoding)) )
if ( IsObject(Content) )
FileObj.Seek(0), FileObj.Length := 0, FileObj.RawWrite(Content[1], Content[2])
else if (Content != "")
FileObj.Write(Content)
return FileObj
} ; https://github.com/flipeador/AutoHotkey/blob/master/Lib/fs/GetTempFile.ahk
Re: Operaciones con archivos seleccionados: copiar, renombrar
Eres un artista, funciona perfectamente, aunque ya se escapa de mi entendimiento.
En mi script, al estar Teracopy dentro de un loop, recibe las ordenes de copiar archivos de uno en uno, por eso me lanza una ventana por cada archivo.
Voy a estudiarmelo detenidamente para tratar de entenderlo, veo que están comentadas todas las órdenes
Muchísimas gracias Flipeador
En mi script, al estar Teracopy dentro de un loop, recibe las ordenes de copiar archivos de uno en uno, por eso me lanza una ventana por cada archivo.
Voy a estudiarmelo detenidamente para tratar de entenderlo, veo que están comentadas todas las órdenes
Muchísimas gracias Flipeador
Who is online
Users browsing this forum: No registered users and 55 guests