Hola revisé el codigo, y no encontré ningun probleme. en mi PC lo corre perfecto, y copie el codigo desde este post, por si las dudas.
Te recomiendo que chekes si tienes la ultima version de AutoIt, y que vuelvas a copiar el codigo del post.
Código: Seleccionar todo
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Icono.ico
#AutoIt3Wrapper_Res_Comment=Persiguiendo el saber!
#AutoIt3Wrapper_Res_Description=Adjunta archivos en AutoIt
#AutoIt3Wrapper_Res_Fileversion=1.0.0.5
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=Ruperto 2008
#AutoIt3Wrapper_Res_Language=2058
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Misc.au3>
#include <String.au3>
#include <File.au3>
$Version = "FileInstallator v1"
#Region ;Creando la interfaz grafica
$Utilidades = GUICreate("Utilidades",300,200,-1,-1)
Global $Error = 0, $N
$Principal = GUICreate("FileInstallator 1.0 By: Ruperto",500,400,-1,-1)
$optTodoEnLaCarpeta = GUICtrlCreateRadio("Todos los archivos de una Carpeta",54,5)
GUICtrlSetState(-1,$GUI_CHECKED)
$optVariosArhivos = GUICtrlCreateRadio("Seleccionar Algunos archivos",250,5)
GUICtrlCreateLabel("Ruta:",10,30)
$txtRuta = GUICtrlCreateInput("",54,28,359)
$cmdSelRec = GUICtrlCreateButton("···",415,27,20,23)
$cmdRefrescar = GUICtrlCreateButton("Refrescar",435,27,55,23)
GUICtrlCreateLabel("Destino:",10,55)
$txtDestino = GUICtrlCreateInput("C:\MiPortable",55,53,358)
$cmdSelDest = GUICtrlCreateButton("...",415,52,20,23)
$cmdAyudaDest = GUICtrlCreateButton("Ayuda",435,52,55,23)
$chkIncSub = GUICtrlCreateCheckbox("Incluir Subdirectorios",54,81)
GUICtrlCreateLabel("Usar este Filtro:",198,85)
$txtFiltro = GUICtrlCreateInput("(*.*) Cualquier Archivo",284,82,105)
$Ayuda = GUICtrlCreateButton("?",390,81,24,23)
$cmdUtilidades = GUICtrlCreateButton("+ Utilidades",416,81,70,23)
$Obtener = GUICtrlCreateButton("Obtener Archivos",10,105,480,40)
$txtCodigo = GUICtrlCreateEdit("",10,150,480,210)
$cmdAbout = GUICtrlCreateButton("Acerca de...",10,370)
$cmdSelTodo = GUICtrlCreateButton("Seleccionar todo",220,370)
$cmdLimpiar = GUICtrlCreateButton("Limpiar",320,370)
$cmdGenerarAu3 = GUICtrlCreateButton("Generar archivo .au3",370,370,122)
GUISetState(@SW_SHOW)
#EndRegion
While 1
$Evento = GUIGetMsg()
Switch $Evento
Case $cmdAyudaDest ;Ayuda para el apartado destino
MsgBox(64,"Ayuda","Tambien puede llenar este campo como en los siguientes Ejemplos: " & @CRLF & @CRLF & _
"1· @WorkingDir & ""\Temp"" (Con una macro de AutoIt)" & @CRLF & _
"2· $PortableDir & ""\MiPortable"" (Con una variable)" & @CRLF & _
"3· C:\MiPortable (Simplemente con una ruta)","",$Principal)
Case $Ayuda
MsgBox(64,"Ayuda","Para usar un filtro multiple use ';' (Punto y Coma) como separador, Por ejemplo: " & @CRLF & _
@CRLF & """(*.Exe;*.Txt) Ejecutables y de texto""" & @CRLF & @CRLF & _
"Siempre es necesario que el Filtro vaya entre parentesis, y lo que esta fuera es comentario",0,$Principal)
Case $GUI_EVENT_CLOSE ;Si quiere cerrar
If WinActive($Principal) Then
If MsgBox(36,"¿Salir?","¿Desea cerrar ahora?","",$Principal)=6 Then
Exit
EndIf
ElseIf WinActive($Utilidades) Then
GUISetState(@SW_HIDE,$Utilidades)
EndIf
Case $cmdSelDest ;Si quiere seleccionar el destino
SelDir("Seleccione la carpeta de destino",$txtDestino)
Case $cmdSelRec
If BitAND(GUICtrlRead($optTodoEnLaCarpeta),$GUI_CHECKED) Then
If SelDir("Seleccione la carpeta de los archivos que desea adjuntar",$txtRuta) = 1 Then
if (MsgBox(36,"Obtener archivos?","¿Desea obtener los archivos de este directorio ahora?",0,$Principal)) = 6 Then
if ValidarFiltro() = 1 Then ObtenerFiles(GUICtrlRead($txtRuta),GUICtrlRead($txtFiltro))
EndIf
EndIf
Else
if ValidarFiltro() = 1 Then
$A = FileOpenDialog("Seleccione los archivos que desea adjuntar",@DesktopDir,GUICtrlRead($txtFiltro),4,"",$Principal)
GenerarCodigo($A)
EndIf
EndIf
Case $Obtener
if ValidarFiltro() = 1 Then ObtenerFiles(GUICtrlRead($txtRuta),GUICtrlRead($txtFiltro))
Case $cmdUtilidades
Utilidades()
Case $cmdSelTodo ;Seleccionar todo
GUICtrlSetState ($txtCodigo,$GUI_FOCUS)
Send("^{END}")
Send("^+{HOME}")
case $cmdLimpiar
GUICtrlSetData($txtCodigo,"")
Case $cmdGenerarAu3 ;Generrar el Archivo au3
If GUICtrlRead($txtCodigo) = "" Then
MsgBox(16,"Error!!","Por ahora no es posible generar el archivo au3, pues no ha adjuntado ningún archivo",0,$Principal)
Else
$RutaAu3 = FileSaveDialog("Guardar archivo au3","","(*.au3) Archivos de AutoIt v3",16,"",$Principal)
if @error = 0 Then
$Ext = StringMid($RutaAu3,StringLen($RutaAu3) - 3,4)
If Not ($Ext = ".au3") Then $RutaAu3 = $RutaAu3 & ".au3"
$RutaAu3Open = FileOpen($RutaAu3,1)
FileWriteLine($RutaAu3Open,";********************************************")
FileWriteLine($RutaAu3Open,@CRLF & ";Archivo generado con FileInstallator v1.0" & @CRLF & ";Creado por Ruperto - [[email protected]]")
FileWriteLine($RutaAu3Open,";********************************************")
FileWrite($RutaAu3Open,@CRLF & GUICtrlRead($txtCodigo))
FileClose($RutaAu3Open)
ShellExecute($RutaAu3)
EndIf
EndIf
Case $cmdAbout
MsgBox(64,$Version,$Version & " Ha sido creado por Ruperto - [[email protected]]" & @CRLF & @CRLF & " AutoIt v3 - [http://www.autoit.au3]",0,$Principal)
EndSwitch
WEnd
Func SelDir($Mensaje, $Control) ;Esta funcion selecciona un direcorio y lo escribe en un control - Esto nos ahorra 8 lines de codigo
$sDir = FileSelectFolder($Mensaje,"",1,"",$Principal)
if Not @error = 1 Then
GUICtrlSetData($Control, $sDir)
Return 1
Else
Return 0
EndIf
EndFunc
Func GenerarCodigo($Files); Funcion que genera el codigo de los archivos seleccionados
$ArregloDeArchivosSeleccionados = StringSplit($Files,"|") ;Separamos lo que retorna la funcion FileSaveDialog a un arreglo
$Ruta = $ArregloDeArchivosSeleccionados[1] ;En la posicion 1, se encuentra la ruta de donde se selccionaron los Archivos
GUICtrlSetData($txtRuta,$Ruta) ;Cambiamos el valor de la caja de texto $txtRuta
For $i = 2 To $ArregloDeArchivosSeleccionados[0] ;Rrecorremos el arreglo de los archivos seleccionados
$Archivo = $ArregloDeArchivosSeleccionados[$i] ;Asigamos el Archivos actual del arreglo a la vaiable $archivo
If StringMid($Archivo,2,1) = ":" Then ;Si en la posicion 2 tiene 2 puntos(:) es por que seleccionó un acceso directo
GUICtrlSetData($txtCodigo,GUICtrlRead($txtCodigo) & "FileInstall(""" & _
$Archivo & """,""" & GUICtrlRead($txtDestino) & "\" & $Archivo & """)" & @CRLF)
Else ;Por el contario fue un archivo cualquiera del directorio Actual
GUICtrlSetData($txtCodigo,GUICtrlRead($txtCodigo) & "FileInstall(""" & _
$Ruta & "\" & $Archivo & """,""" & GUICtrlRead($txtDestino) & "\" & $Archivo & """)" & @CRLF)
EndIf
Next
EndFunc
Func Files2Array($Dir, $Filtro = "(*)") ;la funcion FileListToArray modificada para que permita multiples filtros
Local $hSearch, $sFile, $asFileList = _ArrayCreate(0), $Contador = 0
$Filtro1 = _StringBetween($Filtro,"(",")") ;Obtenemos lo que está entre parentesis
If Not (FileExists($Dir)) Then Return SetError(1, 1, "")
$Exts = StringSplit($Filtro1[0], ";")
For $i = 1 To $Exts[0]
$Filtro = $Exts[$i]
$hSearch = FileFindFirstFile($Dir & "\" & $Filtro)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then
SetError(0)
ExitLoop
EndIf
If StringInStr(FileGetAttrib($Dir & "\" & $sFile), "D") = 0 Then
_ArrayAdd($asFileList, $sFile)
$Contador= $Contador+ 1
EndIf
WEnd
Next
FileClose($hSearch)
_ArrayDelete($asFileList,0)
If ($Contador = 0) Then $Error = 1
If ($Contador <> 0) Then $Error = 0
Return $asFileList
EndFunc ;==>Files2Array
Func ObtenerFiles($Dir, $Filtro = "(*)") ;Obtiene archivos de un directorio, sin incluir subdirectorios
if FileExists($Dir) Then
If BitAND(GUICtrlRead($chkIncSub),$GUI_CHECKED) Then ;Si elijió incluir subDirectorios
$Archivos = Files2Array($Dir ,$Filtro) ;listamos los archivos que existen en la ruta proporcionada
If StringMid($Dir,StringLen($Dir),1) = "\" Then $Dir = StringTrimRight($Dir,1) ;Si incluye Diagonal inversa, se la quitamos (0_0)
If $Error = 0 Then GenerarCodigoA($Archivos, $Dir) ;Si no provocó error la funcion File2Array
$Carpetas = _FileListToArray($Dir,"*",2) ;Agragamos a un arreglo todas las carpetas de una ruta Seleccionada
if Not @error = 1 Then ;Si la funcion anterior no produce error
For $b = 1 to $Carpetas[0] ;Reccoremos el arreglo de las carpetas!
$Ruta = $Dir & "\" & $Carpetas[$b]
GUICtrlSetData($txtCodigo,GUICtrlRead($txtCodigo) & "DirCreate(" & ObtenerDestino() & "\" & ObtenerNombre($Ruta) & """)" & @CRLF)
$Archivos = Files2Array($Ruta,$Filtro)
$Pose = (0 - $b)
ObtenerFiles($Ruta, $Filtro)
Next
EndIf
Else ;si no quiere incluir subDirectorios
$Archivos = Files2Array($Dir ,$Filtro)
If $Error = 0 Then
GenerarCodigoA($Archivos, $Dir)
Else
MsgBox(64,"Error!","No hay archivos que obtener de: " & @CRLF & $Dir,0,$Principal)
EndIf
EndIf
Else
MsgBox(16,"Error!","No existe la ruta recurso que usted ha escrito",0,$Principal)
EndIf
EndFunc
Func GenerarCodigoA($Archivoss, $Dir) ;
If FileExists($Dir) Then
If StringMid($Dir,StringLen($Dir),1) = "\" Then $Dir = StringTrimRight($Dir,1)
$Destino = ObtenerDestino()
For $i = 0 To UBound($Archivoss) - 1
$Archivo = $Dir & "\" & $Archivoss[$i]
GUICtrlSetData($txtCodigo,GUICtrlRead($txtCodigo) & "FileInstall(""" & _
$Archivo & """," & $Destino & "\" & ObtenerNombre($Archivo) & """)" & @CRLF)
Next
EndIf
EndFunc
Func ObtenerNombre($Archivo) ;obtiene el nombre del archivo
$TamDeLaRuta = StringLen(GUICtrlRead($txtRuta)) + 1
$Tam = StringLen($Archivo)
$Archivo = StringRight($Archivo, $Tam - $TamDeLaRuta)
Return $Archivo
EndFunc
Func ObtenerDestino() ;Obtiene el destino
$Dest = StringStripWS(GUICtrlRead($txtDestino),3)
If StringMid($Dest,1,1) = "@" or StringMid($Dest,1,1) = "$" Then
If StringMid($Dest,StringLen($Dest),1) = """" Then $Dest = StringTrimRight($Dest,1)
Return $Dest
Else
Return """" & $Dest
EndIf
EndFunc
Func Utilidades()
GUISetState(@SW_SHOW, $Utilidades)
EndFunc
Func ValidarFiltro() ;La funcion que valida el filtro
If (StringInStr(GUICtrlRead($txtFiltro),"(") And StringInStr(GUICtrlRead($txtFiltro),")")) Then
;Si existen los caracteres ( y )
if StringInStr(GUICtrlRead($txtFiltro),"(")+ 1 < StringInStr(GUICtrlRead($txtFiltro),")") Then ;Si la pos de ( es menor que la pos de )
Return 1
Else
MsgBox(16,"Error!", "El filtro es invalido, por favor si tienes dudas presiona el boton '?'",0,$Principal)
Return 0
EndIf
Else
MsgBox(16,"Error!", "Por favor el filtro debe ir entre parentesis",0,$Principal)
Return 0
EndIf
EndFunc
en cuando a la pregunta de Aprendiz, comento que a mi no me provoca error al saleccionar carpeta. Que SO tienes?