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.
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
# -*- coding: UTF-8 -*- # MoveIt v1.0 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. # Modo de empleo: # # 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:\\MoveIt.rb "E:\Nueva carpeta" # Ejemplo destino (Script compilado a .exe): C:\MoveIt.exe "E:\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 xD) # Si el archivo de destino ya existe, Se pregunta por su reemplazamiento. # Si el archivo está siendo usado por algún proceso abierto, Se da lugar a reintentar o cancelar la operación. # # 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: # MoveIt "C:\Nueva carpeta" # RECORDATORIO # # Caracteres ilegales # # á : .gsub("ß", "á") # é : .gsub("Ú", "é") # í : .gsub("Ý", "í") # ó : .gsub("¾", "ó") # ú : .gsub("·", "ú") # ¿ : .gsub("┐", "\u00BF") # – : .gsub("\û", "\u2013") # ´ : .gsub("\┤", "\u00B4") # · : .gsub("\À", "\u00B7") # ¬ : .gsub("\¼", "\u00AC") # º : .gsub("\║", "\u00BA") # ª : .gsub("\¬", "\u00AA") # # ¡ : FAIL :( # ' : FAIL :( # # Convertir Handle a Hex # puts 1272.to_s 16 # 0x + HandleHEX # Modulos require 'dl' require "FileUtils" require 'win32ole' require 'win32/api' include Win32 exit if Object.const_defined?(:Ocra) # Variables globales y constantes if ARGV.empty? == false $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")) $DIRMSG = (ARGV[0].encode('utf-8').gsub("\û", "-").gsub("ß", "a").gsub("Ú", "e").gsub("Ý", "i").gsub("¾", "o").gsub("·", "u").gsub("┐", "?")) end EnumWindows = API.new('EnumWindows', 'KP', 'L', 'user32') GetWindowText = API.new('GetWindowText', 'LPI', 'I', 'user32') KILOBYTE = 1024.0 MEGABYTE = 1024.0 * 1024.0 BUTTONS_OKCANCEL = 1 BUTTONS_YESNO = 4 CLICKED_CANCEL = 2 CLICKED_YES = 6 CLICKED_NO = 7 # Metodos def help() print "\nSe requiere al menos 1 archivo de origen.\n\n\n" print "Modo de empleo: \n\n" print ' MoveIt.rb [Destino] [Archivo de origen 1] [Archivo de origen 2] [etc...]' + "\n\n\n" print ' Ejemplo: (Mover tres archivos al directorio de destino "C:"' + "\n\n" print ' MoveIt.rb "C:\" "D:\Archivo1.txt" "E:\Archivo2.jpg" "F:\Archivo3.mp3"' + "\n\n" Process.exit end def bytesToUnit size1, size2 $Kilos1 = (size1 / KILOBYTE).to_s $Megas1 = (size1 / MEGABYTE).to_s $Kilos2 = (size2 / KILOBYTE).to_s $Megas2 = (size2 / MEGABYTE).to_s if ($Megas1[0]).eql? '0' or $Megas1["-"] if ($Kilos1[0]).eql? '0' $finalsize1 = size1.to_s + ' Bytes' elsif $finalsize1 = $Kilos1.split('.').first + "." + $Kilos1.split('.').last[0,1] + " Kb" end else $finalsize1 = $Megas1.split('.').first + "." + $Megas1.split('.').last[0,1] + " Mb" end # size1 if ($Megas2[0]).eql? '0' or $Megas2["-"] if ($Kilos2[0]).eql? '0' $finalsize2 = size2.to_s + ' Bytes' elsif $finalsize2 = $Kilos2.split('.').first + "." + $Kilos2.split('.').last[0,1] + " Kb" end else $finalsize2 = $Megas2.split('.').first + "." + $Megas2.split('.').last[0,1] + " Mb" end # size2 end def date (file1, file2) $CDate1 = (File.ctime(file1)).to_s $CDate2 = (File.ctime(file2)).to_s $MDate1 = (File.mtime(file1)).to_s $MDate2 = (File.mtime(file2)).to_s end def message_box(txt, title='', buttons='') user32 = DL.dlopen('user32') msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox') r, rs = msgbox.call([0, txt, title, 3].pack('L!ppL!').unpack('L!*')) return r end def reintentar(source_file, dest_file) $seguro = 'si' if $proceso == nil $proceso = 'DESCONOCIDO' end # if response = message_box("\n" + "El proceso '" + $proceso + "' Tiene abierto el archivo: \n\n" + $archivo + "\n\n\n" + "Reintentar?", "Reintentar?", BUTTONS_OKCANCEL) if response == CLICKED_YES Access($archivoUTF8, $DIR) elsif response == CLICKED_NO $no = "si" nil elsif response == CLICKED_CANCEL exit end # response end def moverlo() @EnumWindowsProc = API::Callback.new('LP', 'I'){ |handle, param| buf = "\0" * 200 GetWindowText.call(handle, buf, 200); if (!buf.index(param).nil?) $seguro = 'no' 0 else $seguro = 'si' 1 end # if } EnumWindows.call(@EnumWindowsProc, $archivo.split('\\').last[0..-6]) if $seguro == 'si' FileUtils.mv $archivoUTF8, $DIR elsif reintentar($archivoUTF8, $DIR) end # seguro end def Access(source_file, dest_file) begin wmi = WIN32OLE.connect("winmgmts://") processes = wmi.ExecQuery("select * from win32_process") for process in processes do caption = (process.Commandline).to_s if not caption['ruby'] and not caption['MoveIt.exe'] if caption.include? $archivo.split('\\').last[0..-6] $proceso = process.Name reintentar($archivoUTF8, $DIR) end # caption.include? end # if not ruby $proceso = nil end # for if not $no == "si" moverlo() end # no rescue if File.exist?($archivoUTF8) == true reintentar($archivoUTF8, $DIR) end # rescue end # begin end # Control de errores if ARGV.empty? == true help() elsif ARGV.length < 2 help() elsif File.directory?($DIR) == false print "\n El directorio de destino no existe: " + $DIR + "\n" response = message_box("\n" + "El directorio de destino no existe: " + "\n\n" + $DIRMSG + "\n\n\n" + "Crear el directorio?", "Crear el directorio?", BUTTONS_YESNO) if response == CLICKED_YES Dir.mkdir $DIR elsif response == CLICKED_NO abort elsif response == CLICKED_CANCEL exit end # response end # Proceso for $archivo in ARGV[1..ARGV.length].each $archivoUTF8 = ($archivo.encode('utf-8').gsub("ß", "á").gsub("Ú", "é").gsub("Ý", "í").gsub("¾", "ó").gsub("·", "ú").gsub("┐", "\u00BF").gsub("\û", "\u2013").gsub("┤", "\u00B4").gsub("\À", "\u00B7").gsub("\¬", "\u00AA").gsub("\¼", "\u00AC").gsub("\║", "\u00BA")) if File.exist?($archivoUTF8) == false print "\n El archivo a mover no existe: " + $archivoUTF8 + "\n" end # File not exist if File.exist?($DIR + "\\" + $archivoUTF8.split('\\').last) bytesToUnit(File.size($archivoUTF8), File.size($DIR + "\\" + $archivoUTF8.split('\\').last)) date($archivoUTF8, $DIR + "\\" + $archivoUTF8.split('\\').last) response = message_box( " Origen : " + $archivo.split($archivo.split('\\').last).first + "\n" + " Archivo : " + $archivo.split('\\').last + "\n" + " Tamano : " + $finalsize1 + "\n" + " Creacion : " + $CDate1.split('+').first + "\n" + " Modificacion : " + $MDate1.split('+').first + " \n\n\n" + " Destino : " + $DIRMSG.split($archivo.split('\\').last).first + "\n" + " Archivo : " + $archivo.split('\\').last + "\n" + " Tamano : " + $finalsize2 + "\n" + " Creacion : " + $CDate2.split('+').first + "\n" + " Modificacion : " + $MDate2.split('+').first + " \n\n\n" + " El archivo de destino ya existe. Reemplazar archivo?", " Reemplazar archivo?", BUTTONS_YESNO) if response == CLICKED_YES Access($archivoUTF8, $DIR) elsif response == CLICKED_NO nil elsif response == CLICKED_CANCEL exit end # response else Access($archivoUTF8, $DIR) end # File exist end # for # Fin exit