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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)  (Leído 3,990 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
[RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« en: 4 Marzo 2012, 15:25 pm »

MoveIt     By Elektro H@cker

 SO: Windows

 Agradecimientos para "kicasta" y "RyogiShiki".


Descripción:
 Mueve archivos desde un punto de origen hasta un punto de destino.
 Está pensado para usarlo como complemento del "SendTo" de Windows, El cual no mueve archivos de un disco duro a otro.



Instrucciones:

 1º Crear un acceso directo a una carpeta.





 2º Abrir las propiedades del aceso directo.




 3º Añadir la ruta de este script a la propiedad "Destino".



 Ejemplo destino:                                       Ruby C:\Windows\MoveIt.rb "C:\Nueva carpeta"
 Ejemplo destino (Script compilado a .exe): C:\Windows\System32\MoveIt.exe "C:\Nueva carpeta"


 4º (Opcional) Guardar el acceso directo modificado en la carpeta "SendTo" (C:\Users\USUARIO\AppData\Roaming\Microsoft\Windows\SendTo)







NOTAS:

 Este script requiere el uso de argumentos. (Uno para la ruta de destino y el otro para el/los archivo(s) a mover.)

 Si la carpeta de destino no existe, se pregunta para crearla o no. (Si no se crea, no se pueden copiar los archivos y se cancelará el programa xD)



 Si el archivo de destino ya existe, Se pregunta por su reemplazamiento.



 Si el archivo está siendo usado por el sistema, Se da lugar a reintentar o cancelar la operación.



Si el archivo de origen contiene el caracter ilegal "–" (u2013) se reemplaza por el caracter "-"

 En equipos de 64 Bit,Hay que copiar el compilado (.exe) tanto a la carpeta "System32" como "SysWOW64" Si se quiere usar la propiedad "Destino" de la siguiente forma en el acceso directo:




El script compilado (No muestra la consola):

EDITADO: 07/03/2012

http://www.mediafire.com/?clyzd39xxlxzn0d



El script:

EDITADO: 07/03/2012


Código
  1. # -*- coding: UTF-8 -*-
  2.  
  3.  
  4. # MoveIt   v1.0  By Elektro H@cker
  5. #
  6. # SO: Windows
  7. # Agradecimientos para "kicasta" y "RyogiShiki".
  8.  
  9.  
  10. # Descripción:
  11. # Mueve archivos desde un punto de origen hasta un punto de destino.
  12. # Está pensado para usarlo como complemento del "SendTo" de Windows, El cual no mueve archivos de un disco duro a otro.
  13.  
  14.  
  15. # Modo de empleo:
  16. #
  17. # 1º Crear un acceso directo a una carpeta.
  18. # 2º Abrir las propiedades del aceso directo.
  19. # 3º Añadir la ruta de este script a la propiedad "Destino".
  20. #
  21. # Ejemplo destino: Ruby C:\\MoveIt.rb "E:\Nueva carpeta"
  22. # Ejemplo destino (Script compilado a .exe): C:\MoveIt.exe "E:\Nueva carpeta"
  23. #
  24. # 4º (Opcional) Guardar el acceso directo modificado en la carpeta "SendTo" (C:\Users\USUARIO\AppData\Roaming\Microsoft\Windows\SendTo)
  25. #
  26.  
  27.  
  28. # Notas:
  29. #
  30. # Este script requiere el uso de argumentos. (Uno para la ruta de destino y el otro para el/los archivo(s) a mover.)
  31. #
  32. # Si la carpeta de destino no existe, se pregunta para crearla o no. (Si no se crea, no se pueden copiar los archivos xD)
  33. # Si el archivo de destino ya existe, Se pregunta por su reemplazamiento.
  34. # Si el archivo está siendo usado por algún proceso abierto, Se da lugar a reintentar o cancelar la operación.
  35. #
  36. # En equipos de 64 Bit,Hay que copiar el compilado (.exe) tanto a la carpeta "System32" como "SysWOW64" Si se quiere usar la propiedad "Destino" de la siguiente forma en el acceso directo:
  37. # MoveIt "C:\Nueva carpeta"
  38.  
  39.  
  40. # RECORDATORIO
  41. #
  42. # Caracteres ilegales
  43. #
  44. # á : .gsub("ß", "á")
  45. # é : .gsub("Ú", "é")
  46. #  í : .gsub("Ý", "í")
  47. # ó : .gsub("¾", "ó")
  48. # ú : .gsub("·", "ú")
  49. # ¿ : .gsub("┐", "\u00BF")
  50. # – : .gsub("\û", "\u2013")
  51. #  ´ : .gsub("\┤", "\u00B4")
  52. #  · : .gsub("\À", "\u00B7")
  53. # ¬ : .gsub("\¼", "\u00AC")
  54. #  º : .gsub("\║", "\u00BA")
  55. #  ª : .gsub("\¬", "\u00AA")
  56. #
  57. #  ¡  : FAIL    :(
  58. #   ' : FAIL    :(
  59. #
  60. # Convertir Handle a Hex
  61. # puts 1272.to_s 16
  62. # 0x + HandleHEX
  63.  
  64.  
  65.  
  66. # Modulos
  67.  
  68. require 'dl'
  69. require "FileUtils"
  70. require 'win32ole'
  71. require 'win32/api'
  72. include Win32
  73.  
  74. exit if Object.const_defined?(:Ocra)
  75.  
  76.  
  77.  
  78. # Variables globales y constantes
  79.  
  80. if ARGV.empty? == false
  81. $DIR = (ARGV[0].encode('utf-8').gsub("ß", "á").gsub("Ú", "é").gsub("Ý", "í").gsub("¾", "ó").gsub("·", "ú").gsub("┐", "\u00BF").gsub("", "\u2013").gsub("┤", "\u00B4").gsub("", "\u00B7").gsub("", "\u00AA").gsub("", "\u00AC").gsub("\║", "\u00BA"))
  82. $DIRMSG = (ARGV[0].encode('utf-8').gsub("", "-").gsub("ß", "a").gsub("Ú", "e").gsub("Ý", "i").gsub("¾", "o").gsub("·", "u").gsub("┐", "?"))
  83. end
  84.  
  85. EnumWindows = API.new('EnumWindows', 'KP', 'L', 'user32')
  86. GetWindowText = API.new('GetWindowText', 'LPI', 'I', 'user32')
  87.  
  88. KILOBYTE = 1024.0
  89. MEGABYTE = 1024.0 * 1024.0
  90.  
  91. BUTTONS_OKCANCEL = 1
  92. BUTTONS_YESNO = 4
  93. CLICKED_CANCEL = 2
  94. CLICKED_YES = 6
  95. CLICKED_NO = 7
  96.  
  97.  
  98.  
  99. # Metodos
  100.  
  101. def help()
  102.  print "\nSe requiere al menos 1 archivo de origen.\n\n\n"
  103.  print "Modo de empleo: \n\n"
  104.  print ' MoveIt.rb [Destino] [Archivo de origen 1] [Archivo de origen 2] [etc...]' + "\n\n\n"
  105.  print ' Ejemplo: (Mover tres archivos al directorio de destino "C:"' + "\n\n"
  106.  print ' MoveIt.rb "C:\" "D:\Archivo1.txt" "E:\Archivo2.jpg" "F:\Archivo3.mp3"' + "\n\n"
  107.  Process.exit
  108. end
  109.  
  110. def bytesToUnit size1, size2
  111.  $Kilos1 = (size1 /  KILOBYTE).to_s
  112.  $Megas1 = (size1 /  MEGABYTE).to_s
  113.  $Kilos2 = (size2 /  KILOBYTE).to_s
  114.  $Megas2 = (size2 /  MEGABYTE).to_s
  115.  
  116.  if ($Megas1[0]).eql? '0' or $Megas1["-"]
  117.     if ($Kilos1[0]).eql? '0'
  118.       $finalsize1 = size1.to_s + ' Bytes'
  119.      elsif
  120.        $finalsize1 = $Kilos1.split('.').first + "." + $Kilos1.split('.').last[0,1] + " Kb"
  121.    end
  122.  else
  123.      $finalsize1 = $Megas1.split('.').first + "." + $Megas1.split('.').last[0,1] + " Mb"
  124.   end # size1
  125.  
  126.  if ($Megas2[0]).eql? '0' or $Megas2["-"]
  127.     if ($Kilos2[0]).eql? '0'
  128.       $finalsize2 = size2.to_s + ' Bytes'
  129.      elsif
  130.        $finalsize2 = $Kilos2.split('.').first + "." + $Kilos2.split('.').last[0,1] + " Kb"
  131.    end
  132.  else
  133.      $finalsize2 = $Megas2.split('.').first + "." + $Megas2.split('.').last[0,1] + " Mb"
  134.  end # size2
  135. end
  136.  
  137. def date (file1, file2)
  138.  $CDate1 = (File.ctime(file1)).to_s
  139.  $CDate2 = (File.ctime(file2)).to_s
  140.  $MDate1 = (File.mtime(file1)).to_s
  141.  $MDate2 = (File.mtime(file2)).to_s
  142. end
  143.  
  144. def message_box(txt, title='', buttons='')
  145.  user32 = DL.dlopen('user32')
  146.  msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox')
  147.  r, rs = msgbox.call([0, txt, title, 3].pack('L!ppL!').unpack('L!*'))
  148.  return r
  149. end
  150.  
  151. def reintentar(source_file, dest_file)
  152.  
  153.  $seguro = 'si'
  154.  
  155.  if $proceso == nil
  156.    $proceso = 'DESCONOCIDO'
  157.  end # if
  158.  
  159.  response = message_box("\n" +
  160.    "El proceso '" + $proceso + "' Tiene abierto el archivo: \n\n" + $archivo  + "\n\n\n" +
  161.    "Reintentar?",
  162.    "Reintentar?",
  163.    BUTTONS_OKCANCEL)
  164.    if response == CLICKED_YES
  165.   Access($archivoUTF8, $DIR)
  166.    elsif response == CLICKED_NO
  167.      $no = "si"
  168.      nil
  169.    elsif response == CLICKED_CANCEL
  170.      exit
  171.    end # response
  172.  
  173. end
  174.  
  175. def moverlo()
  176.  @EnumWindowsProc = API::Callback.new('LP', 'I'){ |handle, param|
  177.   buf = "\0" * 200
  178.   GetWindowText.call(handle, buf, 200);
  179.  
  180.  if (!buf.index(param).nil?)
  181.    $seguro = 'no'
  182.    0
  183.  else
  184.    $seguro = 'si'
  185.    1
  186.  end # if
  187. }
  188. EnumWindows.call(@EnumWindowsProc, $archivo.split('\\').last[0..-6])
  189.  if $seguro == 'si'
  190.    FileUtils.mv $archivoUTF8, $DIR
  191.  elsif
  192.    reintentar($archivoUTF8, $DIR)
  193.  end # seguro
  194. end
  195.  
  196.  
  197. def Access(source_file, dest_file)
  198. begin
  199.  wmi = WIN32OLE.connect("winmgmts://")
  200.  processes = wmi.ExecQuery("select * from win32_process")
  201.  
  202.  for process in processes do
  203.    caption = (process.Commandline).to_s
  204.      if not caption['ruby'] and not caption['MoveIt.exe']
  205.        if caption.include? $archivo.split('\\').last[0..-6]
  206.           $proceso = process.Name
  207.            reintentar($archivoUTF8, $DIR)
  208.        end # caption.include?
  209.      end # if not ruby
  210.      $proceso = nil
  211.    end # for
  212.  if not $no == "si"
  213.    moverlo()
  214.  end # no
  215.  rescue
  216.    if File.exist?($archivoUTF8) == true
  217.      reintentar($archivoUTF8, $DIR)
  218.  end  # rescue
  219. end # begin
  220. end
  221.  
  222.  
  223.  
  224. # Control de errores
  225.  
  226. if ARGV.empty? == true
  227.  help()
  228. elsif ARGV.length < 2
  229.  help()
  230. elsif File.directory?($DIR) == false
  231.  print "\n El directorio de destino no existe: " + $DIR + "\n"
  232.    response = message_box("\n" +
  233.      "El directorio de destino no existe: "  + "\n\n" +  $DIRMSG + "\n\n\n" +
  234.      "Crear el directorio?",
  235.      "Crear el directorio?",
  236.      BUTTONS_YESNO)
  237.    if response == CLICKED_YES
  238.      Dir.mkdir $DIR
  239.    elsif response == CLICKED_NO
  240.      abort
  241.    elsif response == CLICKED_CANCEL
  242.      exit
  243.    end # response
  244. end
  245.  
  246.  
  247.  
  248. # Proceso
  249.  
  250. for $archivo in ARGV[1..ARGV.length].each
  251. $archivoUTF8 = ($archivo.encode('utf-8').gsub("ß", "á").gsub("Ú", "é").gsub("Ý", "í").gsub("¾", "ó").gsub("·", "ú").gsub("&#9488;", "\u00BF").gsub("", "\u2013").gsub("&#9508;", "\u00B4").gsub("", "\u00B7").gsub("", "\u00AA").gsub("", "\u00AC").gsub("\&#9553;", "\u00BA"))
  252.  
  253.    if File.exist?($archivoUTF8) == false
  254.      print "\n El archivo a mover no existe: " + $archivoUTF8 + "\n"
  255.    end # File not exist
  256.  
  257.    if File.exist?($DIR + "\\" + $archivoUTF8.split('\\').last)
  258.      bytesToUnit(File.size($archivoUTF8), File.size($DIR + "\\" + $archivoUTF8.split('\\').last))
  259.      date($archivoUTF8, $DIR + "\\" + $archivoUTF8.split('\\').last)
  260.      response = message_box(
  261.        " Origen             :  " + $archivo.split($archivo.split('\\').last).first + "\n" +
  262.        " Archivo           :  " +  $archivo.split('\\').last + "\n" +
  263.        " Tamano          :   " + $finalsize1 + "\n" +
  264.        " Creacion         :   " + $CDate1.split('+').first + "\n" +
  265.        " Modificacion :   " + $MDate1.split('+').first + " \n\n\n" +
  266.        " Destino           :  " + $DIRMSG.split($archivo.split('\\').last).first + "\n" +
  267.        " Archivo           :  " +  $archivo.split('\\').last + "\n" +
  268.        " Tamano          :   " + $finalsize2 + "\n" +
  269.        " Creacion         :   " + $CDate2.split('+').first + "\n" +
  270.        " Modificacion :   " + $MDate2.split('+').first + " \n\n\n" +
  271.        " El archivo de destino ya existe. Reemplazar archivo?",
  272.        " Reemplazar archivo?",
  273.        BUTTONS_YESNO)
  274.      if response == CLICKED_YES
  275.        Access($archivoUTF8, $DIR)
  276.      elsif response == CLICKED_NO
  277.        nil
  278.      elsif response == CLICKED_CANCEL
  279.        exit
  280.      end # response
  281.    else
  282.      Access($archivoUTF8, $DIR)
  283.    end # File exist
  284. end # for
  285.  
  286.  
  287.  
  288. # Fin
  289. exit


« Última modificación: 31 Marzo 2012, 00:37 am por EleKtro H@cker » En línea


WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
Re: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« Respuesta #1 en: 4 Marzo 2012, 15:26 pm »

Vaya, al final lo conseguiste! Felicidades!  ;-)


En línea

La cacatúa yoyó es nueva en el zoo!
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« Respuesta #2 en: 5 Marzo 2012, 14:24 pm »

He mejorado el code con lo poco que sé de Ruby  :P

Si la carpeta de destino no existe, se pregunta para crearla o no. (Si no se crea, no se pueden copiar los archivos xD)

Y en fin, antes daba un error si la ruta contenia el caracter " ú ", ya lo he corregido.

Ah, Y ya no reemplaza el caracter " – ", Si el archivo contiene ese caracter (u otro ilegal) Lo copia tal cual...

Solo me falta saber como ocultar la maldita CMD (Sin usar nircmd XD o win32ole), O mejor aún, Comprobar si un archivo está abierto por algún proceso sin usar la CMD, sería mucho más eficaz...


Resumiendo, Necesito una forma más nátiva y eficaz en Ruby para comprobar si un archivo está siendo usado por algún proceso:

Ejemplo:
Código
  1. If $archivo ABIERTO POR $cualquier_programa_de_windows
  2. Sleep 01
  3. elsif
  4. mover $archivo a...
  5. end

PD: Deposite su ayuda ----->   [     AQUÍ     ]  <-----

Gracias
« Última modificación: 5 Marzo 2012, 16:03 pm por EleKtro H@cker » En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« Respuesta #3 en: 5 Marzo 2012, 19:07 pm »

He vuelto a modificar el script, Ahora muestra más información en esta ventana:



No he conseguido hacer un "split" para cortar los 5 dígitos del final, Pero bueno.

Sé que es una "tool" rara, pero no por eso tiene que dejar de ser interesante (Aunque sea para aprender), Prueben y comenten xD

La sintaxis indentación y demás ccomo por ejemplo los métodos repetidos o la funcion de convertir el tamaño a MB se puede simplificar para no repetirlo, Lo sé está fatal, Es lo que tiene probar 1.000 cosas en un día y hacer 2.000 tests con cada modificación para asegurar que no haya errores...
Cuando consiga lo único que me falta para acabar este maldito code lo arreglaré todo y lo dejaré bonito xD


Salu2
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« Respuesta #4 en: 6 Marzo 2012, 16:36 pm »

He simplificado el code como he podido, bueno, digamos que le he "quitado mierd@" xD

he corregifo un fallo , no salia la pantalla de ayuda

hmmm, me faltaba por agregar unos cuantos cracteres ilegales bastante comunes en los nombres de los archivos como º ª ´, todavia me faltan 2 más, uno muy importante es la comilla ', pero no se como hacerlo, ya lo descubriré.

Y ya he arreglado la caja de dialogo para que no muestre esos últimos 5 dígitos.

Ahora sí, Ya no lo edito más hasta que encuentre ayuda para el problemón del acceso al archivo, Lo prometo (Dedos cruzados :P). Lo cierto es que lo volveré a editar si me doy cuenta de algún fallo...


Saludos...
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.696



Ver Perfil
Re: [RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)
« Respuesta #5 en: 7 Marzo 2012, 09:45 am »

Bueno, a esto ya se le puede llamar versión 1.0 :)

No he correjido fallos porque no hay xD

Pero ya no usa la CMD para comprobar si un archivo está abierto por algún proceso antes de moverlo :)

He retocado un poco más la info de los dialogos de texto, arriba podeis ver las imagenes (Si es que a alguien le interesa esto xD...)


saludos
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[APORTE] Menu en cascada para Windows 8 - Permisos de usuario
Windows
Eleкtro 9 4,119 Último mensaje 16 Septiembre 2013, 17:34 pm
por Stakewinner00
[APORTE] Menu en cascada para Windows 8 - Personalizar
Windows
Eleкtro 0 1,433 Último mensaje 15 Septiembre 2013, 20:56 pm
por Eleкtro
[APORTE] Menu en cascada para Windows 8 - Accesorios de Windows
Windows
Eleкtro 0 1,435 Último mensaje 15 Septiembre 2013, 21:03 pm
por Eleкtro
[APORTE] Menu en cascada para Windows 8 - Explorer
Windows
Eleкtro 0 1,243 Último mensaje 16 Septiembre 2013, 16:20 pm
por Eleкtro
[APORTE] Menu en cascada para Windows 8 - Copiar Información
Windows
Eleкtro 0 1,263 Último mensaje 17 Septiembre 2013, 17:27 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines