Página 1 de 1

Copiar un archivo desde su acceso directo

Publicado: 01 May 2011, 10:36
por Esgrimidor
Copiar un archivo desde su acceso directo

Me gustaría encontrar o desarrollar una aplicación que hiciera lo siguiente :

Un acceso directo en una carpeta.
Un acceso directo es un puntero que señala o nos lleva al archivo original ubicado normalmente en otra parte.

El objetivo es :
Seleccionar el archivo (o varios mejor) con el ratón.
Aplicar una shortkey o combinación de teclas atajo.
Que se produzca la transformación en la carpeta de trabajo del acceso directo en el archivo original al que apuntaba el acceso directo convertido o transformado.
El proceso es que copia a la carpeta del acceso directo el archivo original. Y que borre el acceso directo una vez realizado lo anterior.

Nota : la cosa podemos complicarla con muchas variantes. A mí sólo me interesa que el acceso directo sea substituido por una COPIA del archivo original al que apuntaba el acceso directo. Y que luego se borre el acceso directo transformado ya.

Gracias

Re: Copiar un archivo desde su acceso directo

Publicado: 02 May 2011, 07:47
por sahsanu
Lo tengo casi acabado y funcionando para Windows XP, cuando pueda probarlo en un Windows 7 lo pondré (que será esta noche).

Un saludo

Re: Copiar un archivo desde su acceso directo

Publicado: 02 May 2011, 14:57
por Esgrimidor
Okis. Yo también lo tengo ya para windows xp que es lo que uso casi siempre.

Re: Copiar un archivo desde su acceso directo

Publicado: 03 May 2011, 01:32
por sahsanu
Bueno, aquí estoy otra vez ;-).

Lo he estado probando y parece que funciona tanto en Windows XP como en Windows 7 (no tengo ningún Vista a mano ni ganas).

Dos puntualizaciones:
1.- El código es bastante mejorable, lo he hecho rápido así que es susceptible de muchas mejoras.
2.- El mérito es de la gente que hizo la función _WindowsExplorer_ExtractSelectedDirAndFiles. La saqué de http://goo.gl/x40JC

Funcionamiento:
Vas a una ventana del Explorador de Windows, seleccionas lo que quieras y le das a las teclas Ctrl+Alt+p.

Más puntualizaciones:
1.- Sólo se sustituirán los accesos directos que apunten a un fichero, si apuntan a un directorio serán ignorados para evitar copiar más de lo que debiéramos ;-)
2.- Como no me gusta borrar cosas sin tenerlo muy claro, en vez de borrar el acceso directo, se mueve a un directorio llamado sandbox-cambiazo. Para borrar el acceso directo en vez de moverlo intercambia el comentario ";" en estas líneas del código:

Código: Seleccionar todo

;FileDelete($sacandoaccesos[$i])
FileMove($sacandoaccesos[$i],$destino & "sandbox-cambiazo\",8)
3.- Se sale del programa con Alt+ESC

Espero que le resulte útil a alguien.

Código: Seleccionar todo

Global $aSeleccion,$sacandoaccesos

HotKeySet("!{ESC}","_Salir") ; Alt + ESC para salir
HotKeySet("^!p","_Cambiazo") ; Ctrl + Alt + p para ejecutar la acción

While 1
	Sleep(120000)
WEnd

Func _Cambiazo()
	If WinActive("[REGEXPCLASS:(Explore|Cabinet)WClass]") Then
		$aWinList = WinGetHandle("[REGEXPCLASS:(Explore|Cabinet)WClass]")
		$aSeleccion = _WindowsExplorer_ExtractSelectedDirAndFiles($aWinList)
		If @error Then
			MsgBox(16,"Error","Lo siento pero ha ocurrido un error y no he podido hacer mi trabajo")
		ElseIf $aSeleccion[0] = 0 Then
			MsgBox(48,"Meeeeeec","Si no seleccionas nada poco voy a poder hacer",5)
		Else
			_DaleCandela()
		EndIf
	Else
		MsgBox(48,"Lo siento pero...", "para hacer mi trabajo debes estar en una ventana del Explorador de Windows",5)
	EndIf
EndFunc

Func _DaleCandela()
	Local $cuentaAccesos = 0
	$sacandoaccesos = ""

	For $i=2 to UBound($aSeleccion)-1
		If StringRegExp($aSeleccion[$i],".*lnk$",0) = 1 Then
			$sacandoaccesos &= $aSeleccion[$i] & "|"
			$cuentaAccesos += 1
		EndIf
	Next

	If $cuentaAccesos > 0 Then
		$sacandoaccesos = StringSplit(StringTrimRight($sacandoaccesos,1),"|")
			If $sacandoaccesos[0] = UBound($aSeleccion)-2 Then
				$cuentaAccesos = 0
				_Finiquitando()
			Else
				MsgBox(32,"Informativo","No todos los ficheros seleccionados son accesos directos pero trabajaré con el resto",3)
				$cuentaAccesos = 0
				_Finiquitando()
			EndIf
	Else
		MsgBox(48,"Puede que sea yo pero...","no has seleccionado ningún acceso directo",5)
		Return
	EndIf
EndFunc

Func _Finiquitando()
	For $i=1 to $sacandoaccesos[0]
		Local $original=FileGetShortcut($sacandoaccesos[$i])
		If IsArray($original) Then
			If Not StringInStr(FileGetAttrib($original[0]),"D") Then ;Evito copiar directorios
				$destino=StringRegExpReplace($sacandoaccesos[$i],"^(.*\\)(.*)$","$1")
				FileCopy($original[0],$destino)
					If @error Then
						Msgbox(16,"Error copiando","Ha ocurrido un error copiando el siguiente fichero " & @CRLF & $original[0] & @CRLF & @CRLF & "en el directorio:" & @CRLF & $destino)
					Else
						;FileDelete($sacandoaccesos[$i])
						FileMove($sacandoaccesos[$i],$destino & "sandbox-cambiazo\",8)
					EndIf
			Else
				Msgbox(48,"Lo siento pero...","uno de los accesos directos apunta a este directorio y no voy a copiarlo:" & @CRLF & $original[0],5)
			EndIf
		EndIf
	Next
EndFunc

Func _Salir()
	MsgBox(64,"Bye bye","Saliendo de Cambiazo",1)
	Exit 0
EndFunc

Func _WindowsExplorer_ExtractSelectedDirAndFiles($hWnd)
    Local $aExplorerSelectedFiles[2] = [0, ""]
    If Not IsHWnd($hWnd) Then Return SetError(1, 0, $aExplorerSelectedFiles)
    Local $aWinList = WinList("[REGEXPCLASS:(Explore|Cabinet)WClass]")
    While 1
        For $i = 1 To UBound($aWinList) - 1
            If $hWnd = $aWinList[$i][1] Then ExitLoop 2
        Next
        Return SetError(2, 0, $aExplorerSelectedFiles)
    WEnd
    Local $oShellApp = ObjCreate("Shell.Application")
    If Not IsObj($oShellApp) Then Return SetError(3, 0, $aExplorerSelectedFiles)
    Local $oShellApp_Windows = $oShellApp.Windows()
    If Not IsObj($oShellApp_Windows) Then Return SetError(4, 0, $aExplorerSelectedFiles)
    For $oShellApp_Inst In $oShellApp_Windows
        If $oShellApp_Inst.hwnd = $hWnd Then ExitLoop
    Next
    Local $iShellApp_Inst_SelectedItems_Count = $oShellApp_Inst.Document.SelectedItems.Count
    Local $sShellApp_Inst_LocationURL = $oShellApp_Inst.LocationURL
    Local $aRet = DllCall('shlwapi.dll', 'long', 'PathCreateFromUrlW', 'wstr', $sShellApp_Inst_LocationURL, 'wstr', '', 'dword*', 65534, 'dword', 0)
    If Not @error And $aRet[0] = 0 Then $sShellApp_Inst_LocationURL = $aRet[2]
    $aExplorerSelectedFiles[0] = $iShellApp_Inst_SelectedItems_Count
    $aExplorerSelectedFiles[1] = $sShellApp_Inst_LocationURL
    ReDim $aExplorerSelectedFiles[$aExplorerSelectedFiles[0] + 2]
    $oShellApp_Inst_SelectedItems = $oShellApp_Inst.Document.SelectedItems
    Local $iCounter = 2
    For $oShellApp_Inst_SelectedItem In $oShellApp_Inst_SelectedItems
        $aExplorerSelectedFiles[$iCounter] = $oShellApp_Inst_SelectedItem.path
        $iCounter += 1
    Next
    $oShellApp = 0
    $oShellApp_Windows = 0
    $oShellApp_Inst = 0
    $oShellApp_Inst_SelectedItems = 0
    $oShellApp_Inst_SelectedItem = 0
    Return $aExplorerSelectedFiles
EndFunc   ;==>_WindowsExplorer_ExtractSelectedDirAndFiles

Re: Copiar un archivo desde su acceso directo

Publicado: 03 May 2011, 19:52
por Esgrimidor
Me pongo en marcha.
Te comentaré como me ha ido con él. Y lo testaré.
El código que yo tenía no va muy allá, y es en otro lenguaje. Así que mejor me abstengo de ponértelo.
Tengo también un código de conversión de accesos directos en los archivos a los que apuntan que explora carpetas y subcarpetas. Es un exe y creo que está en otro lenguaje. De todas formas cualquier cosa que te interese te la mando por MP o te la cuelgo de alguna parte. Así no distraigo el objeto del foro que es AutoIt.

Gracias

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 07:55
por Ximorro
¿Pero esto de acceder a los archivos a los que apuntan los accesos directos no lo hemos resuelto ya por otro post? :smt017

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 08:32
por Esgrimidor
Ximorro escribió:¿Pero esto de acceder a los archivos a los que apuntan los accesos directos no lo hemos resuelto ya por otro post? :smt017
Yo no me acuerdo.

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 11:35
por Ximorro
Pues aquí preguntabas algo parecido, ¿no sería retomar ese trabajo?
http://www.emesn.com/autoitforum/viewto ... cto#p10220

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 13:50
por Esgrimidor
Primeras pruebas satisfactorias.
Ahora voy a tratar de desvelar los secretos del script y consultar algún comando o cosa que no entienda.

Gracias

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 14:01
por Esgrimidor
Me pierdo un poco con :

While 1
Sleep(120000)
WEnd

el valor 1 se refiere a las variables declaradas al comienzo del script ?

Mi interpretación del script es que tras declarar las variables y las teclas atajo luego se ejecutan una serie de funciones definidas, salvo el while inicial que introduce una espera de 120.000 milisegundos.

Cualquier comentario agradecido.

Re: Copiar un archivo desde su acceso directo

Publicado: 04 May 2011, 19:15
por Esgrimidor
Ximorro escribió:Pues aquí preguntabas algo parecido, ¿no sería retomar ese trabajo?
http://www.emesn.com/autoitforum/viewto ... cto#p10220
Imagen

Pues no. Porque este script de aquí funciona para lo que pedí , y la copia inteligente la tengo en un exe que no se lo que contiene y que falla un poco. Vamos que de 486 shortcuts me detecta 484, pero dentro de carpetas y subcarpetas.
Al final habrá que ir revisando todo para montar el escrito director y con este estupendo script remato cualquier cosa porque funciona de perlas.
Además me permite revisarlo y tratar de aprender de él.
Y además quiero retomar el XAMPP y las bases SQL en plan muy sencillo a ver si puedo hacer las dos boberías que necesito. Porque programar un día, pasar un año, y volver a programar es una actividad dura. Pero ahí está el reto. Tendré que positivar o cambiarme de nick. Mendigo me iría de perlas.

Gracias

Re: Copiar un archivo desde su acceso directo

Publicado: 05 May 2011, 00:51
por sahsanu
Esgrimidor escribió:Me pierdo un poco con :

While 1
Sleep(120000)
WEnd

el valor 1 se refiere a las variables declaradas al comienzo del script ?
No, el valor 1 es la expresión que utiliza el While para no terminar nunca, ese 1 puedes sustituirlo por 23, 5034, por True, etc. siempre y cuando la expresión sea verdadera el while nunca acabará. En este caso 1 siempre será 1, así que el script nunca acabará, a no ser claro que se pulse el atajo de teclas que hemos definido para salir. El Sleep es para que el script no consuma recursos de CPU.
Esgrimidor escribió:Mi interpretación del script es que tras declarar las variables y las teclas atajo luego se ejecutan una serie de funciones definidas, salvo el while inicial que introduce una espera de 120.000 milisegundos.
Sí, se definen varias variables globales y los atajos de teclado. Las funciones no se ejecutarán jamás si no se ejecuta el atajo de teclado que es el que las dispara. El While estará siempre en ejecución (como he dicho arriba, evita que el script termine y se cierre).

Espero que ahora quede algo más claro.

Re: Copiar un archivo desde su acceso directo

Publicado: 05 May 2011, 01:04
por Chefito
Buen trabajo sahsanu :smt023 . Y buena investigación. Eso es lo que tendríamos que hacer todos los programadores (o pseudoprogramadores :smt003 ) antes de preguntar en el foro.
Por cierto, me quedo con la función por si algún día la puedo necesitar :smt002 .

Como he dicho muchas veces, eso de pedir código sin aportar nada no lo veo nada bien (esto va por tí, esgrimidor.....que ya nos vamos conociendo y sabemos de que pie cojea cada uno :smt005 ). Intenta hacerlo por tu cuenta, e intenta no escribir tantos mensajes sin decir practicamente nada :smt011 .
Si tienes un código y lo quieres compartir, aunque sea en otro lenguaje, cuelgalo en el subforo chat, que para eso también está (puede que su estrutura ayude a alguien a realizar el algoritmo en AutoIt). Si no vas a colgar nada, mejor no digas nada, porque das que pensar..... :smt017 .

Saludos.

Re: Copiar un archivo desde su acceso directo

Publicado: 05 May 2011, 09:08
por Ximorro
esgrimidor, como tú mismo decías en la otra entrada de los accesos directos "es hora de empezar a programar". :smt003

Esas preguntas que haces sobre el bucle son muy básicas, si no entiendes eso seguramente de lo demás entenderás mucho menos.
Eso no es malo, nadie nace sabiendo, lo malo es no querer avanzar. Igual que Chefito te recomiendo que empieces con AutoIT y empieces a hacerte cositas tú mismo. No podemos estar haciéndote programas que no entiendas, te será mucho más satisfactorio si los entiendes... ¡e incluso si te los puedes programar tú! Este es un foro de soporte a programadores (no de hacer programas por petición) y te ayudaremos en todo lo que podamos en las dudas que te surjan programando.

Te recomiendo empezar leyendo en la ayuda los temas básicos, si ya sabes programar en otro lenguaje problablemente lo entiendas todo muy pronto pero aún así esto hay que mirárselo para ver las partucularidades de AutoIt. En esta entrada hice un compendio de lo que interesa mirarse para empezar:
http://www.emesn.com/autoitforum/viewto ... f=2&t=2593

Lo de copiar un archivo teniendo su referencia desde un acceso directo casi te lo resolvió BasicOS en la otra entrada que te enlazaba, donde tú mismo lo preguntabas, el truco estaba en obtener el archivo desde el acceso directo con FileGetShortcut. Ciertamente no te daba un programa hecho, pero a partir de ahí hacer uno con funcionalidad básica no era difícil. sahsanu aún ha ido más allá y ha hecho un programa completo estupendo con integración en explorer, manejo de varios archivos a la vez, etc... Al final lo que has conseguido es que te hagan el programa completo, pero sinceramente, creo que el problema es el mismo que preguntabas la otra vez: copiar un archivo en vez de su acceso directo. Tendrías que haber seguido ese hilo y hacer tu programa copiador. Te recomiendo hacerlo y aprenderás mucho, también puedes aprender con el programa de sahsanu, pero te advierto que este es un programa bastante avanzado para cogerlo así de primeras sin experiencia en AutoIt...

Re: Copiar un archivo desde su acceso directo

Publicado: 07 May 2011, 00:52
por Esgrimidor
sahsanu escribió:
Esgrimidor escribió:Me pierdo un poco con :

While 1
Sleep(120000)
WEnd

el valor 1 se refiere a las variables declaradas al comienzo del script ?
No, el valor 1 es la expresión que utiliza el While para no terminar nunca, ese 1 puedes sustituirlo por 23, 5034, por True, etc. siempre y cuando la expresión sea verdadera el while nunca acabará. En este caso 1 siempre será 1, así que el script nunca acabará, a no ser claro que se pulse el atajo de teclas que hemos definido para salir. El Sleep es para que el script no consuma recursos de CPU.
Esgrimidor escribió:Mi interpretación del script es que tras declarar las variables y las teclas atajo luego se ejecutan una serie de funciones definidas, salvo el while inicial que introduce una espera de 120.000 milisegundos.
Sí, se definen varias variables globales y los atajos de teclado. Las funciones no se ejecutarán jamás si no se ejecuta el atajo de teclado que es el que las dispara. El While estará siempre en ejecución (como he dicho arriba, evita que el script termine y se cierre).

Espero que ahora quede algo más claro.
Muchas gracias. Muchos ánimos.

Re: Copiar un archivo desde su acceso directo

Publicado: 07 May 2011, 00:55
por Esgrimidor
Vale vale muchachos de más arriba. A lo mejor un día les doy una idea o aporto algo. O simplemente soy un buen conejillo de indias.
Qué van a hacer con tanto conocimiento acumulado ?
No se si sentirme aludido por el rebaje impresionante de mi capacidad intelectual.
¿ O no será que el trabajo paciente y la dedicación contínua de un programador de verdad son los que dan resultados ?
No son más listos. Sólo tienen más tiempo que yo para esto......

Re: Copiar un archivo desde su acceso directo

Publicado: 09 May 2011, 08:55
por Ximorro
Nadie ha dicho que seamos más listos. Lo que te estamos diciendo es que este es un foro de apoyo a programadores, y con el tiempo que llevas por el foro, por poco tiempo que hayas tenido para aprender AutoIt, si aún no entiendes por ejemplo ese bucle es que no le has dedicado prácticamente nada de tiempo. :smt017
Desgraciadamente la impresión que da eso es que parece que pides que te hagan los programas, pues no parece que tú vayas a hacerlos, ya sea por desinterés por aprender a programar en AutoIt o por absoluta falta de tiempo (nunca hemos insinuado nada de tu capacidad intelectual, así que te agradecería que no nos recrimines eso). :smt018

Evidentemente nadie te obliga a aprender AutoIt ni a dedicarle un tiempo del que quizás no dispones, simplemente te decimos que si estás en esa situación quizás este foro no sea el más adecuado para ayudarte. Como digo en este foro se ayuda a la gente que está haciendo scripts AutoIt, si tú no puedes por la razón que sea y necesitas que alguien te programe algo siempre puedes ponerlo en el foro de Chat y contactar con algún programador.

Tú sigue preguntando en el foro, aunque no lo creas eres bienvenido, pero explicar un programa a alguien que te pregunta si While 1 se refiere a una variable anterior es una ardua tarea. ¿Cómo vas a entender el resto del código? Por eso decimos que tienes que poner más de tu parte si quieres programarte tus utilidades, ni más ni menos.

Re: Copiar un archivo desde su acceso directo

Publicado: 11 May 2011, 01:26
por Esgrimidor
Bueno mátame ya y listo. Tampoco te quito la razón.

Juicio sumarísmo y listo. Culpable en toda regla.

Pim Pam fuegoooooo

Re: Copiar un archivo desde su acceso directo

Publicado: 16 May 2011, 00:37
por BasicOs
Esgrimidor escribió:Bueno mátame ya y listo. Tampoco te quito la razón.

Juicio sumarísmo y listo. Culpable en toda regla.

Pim Pam fuegoooooo
Lo de Esgrimidor, ya le dije que tenía un error de PLANTEAMIENTO O de método al programar, que mirara la programación no como una información COMPLICADA Y EXTERNA que tiene que descifrar, si no que, sabiendo que Esgrimidor es un ingeniero (no informático claro), pensara en la programación como en el lenguaje de cada día y que lo primero que escribiera el código en ESPAÑOL (pseudocódigo), en un papel y que luego autoit es super facil para poder pasar de pseudo código (español con sus algoritmos y en orden) a código en el editor.

Por ejemplo lo de While 1 sería --> Mientras Verdad entonces sigo en bucle haciendo lo que hay hasta WEND y luego vuelvo. Y el SI UNAVARIABLE vale tanto ENTONCES PASARIA o se ejecuta otro código con IF THEN HASTA EL (ENDIF).

Con estas dos simples ordenes while/if, sabiendo como funcionan las variables $mivariable=1 y buscando en los cientos de funciones de autoit puede hacer cualquier cosa, sin DOLOR.

Salu22:)

Salu22:)

Re: Copiar un archivo desde su acceso directo

Publicado: 05 Jun 2011, 17:41
por Esgrimidor
Claro claro.
En toda regla. Vamos.
He revisado el post.
Un besito.
Mi problema está solucionado en este ámbito.
Ahora a mendigar en el otro.
Siempre hay gente que ayuda.
No lo duden.

:smt045