Operaciones con archivos seleccionados: copiar, renombrar

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Operaciones con archivos seleccionados: copiar, renombrar

24 Jul 2018, 06:52

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 :roll:
Agradecería si me pudierais echar un cable :?:

Mil gracias :bravo:
txema
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

24 Jul 2018, 08:13

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:

Code: Select all

SendInput ^c
Sleep 500
MsgBox % Clipboard
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.
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

24 Jul 2018, 13:04

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
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

24 Jul 2018, 16:07

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
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

25 Jul 2018, 05:59

Muchas gracias de nuevo :D
Voy a ver si lo apaño
Un saludo :bravo:
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

26 Jul 2018, 10:33

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 :clap:

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
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

26 Jul 2018, 12:28

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.
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

26 Jul 2018, 14:29

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
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

27 Jul 2018, 07:55

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

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
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

27 Jul 2018, 08:09

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.
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

27 Jul 2018, 08:17

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.
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

27 Jul 2018, 09:12

Muchas gracias una vez mas.
Me estudio esos comandos y lo comento
Un saludo
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

30 Jul 2018, 06:04

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.
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.
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 :thumbup: :wave:

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

User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Operaciones con archivos seleccionados: copiar, renombrar

30 Jul 2018, 09:09

Prueba este script (si TeraCopy no copia los archivos correctamente puedes intentar reemplazar UTF-16 por UTF-8 o CP0).:

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
Para mover los archivos utiliza el comando FileMove, tal cual lo has descrito. Para mover con TeraCopy solo hay que cambiar Copy por Move.
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library
tx75
Posts: 9
Joined: 24 Jul 2018, 06:42

Re: Operaciones con archivos seleccionados: copiar, renombrar

31 Jul 2018, 05:40

Eres un artista, funciona perfectamente, aunque ya se escapa de mi entendimiento. :bravo:
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 :bravo:

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 4 guests