Página 1 de 1

se puede hacer en autoit

Publicado: 25 Oct 2010, 18:11
por timistar
buen dia

moachos espero esten bien

les pregunto una cosa a ver si se puede

tengo una carpeta que dentro tiene unas subcarpetas y cada una tiene un archivos la estructura es la sgte :

folder
-- > subfolder 1
-->subfoler2
--> archivo_bodega5.pdf


lo que yo quero es lo sgte :
todo el tiempo estare creando arvhiso con el nombre

archivo_bodega5.pdf

el detalle esque sera con distintas termianciones osea

archivo_bodega_c6.pdf
archivo_bodega_d7.pdf
archivo_bodega_x70.pdf

y aqui viene la pregnuta


se puede crear con autoit un scrip que me cree carpetas con el nombre del archivo pero solo con determinada parte de este ejemplo :

si tengo los archivos


archivo_bodega_s6.pdf
archivo_bodega_F7.pdf
archivo_bodega_O70.pdf

el sistema me cree la carpetas

bodega_s6
bodega_F7
bodega_O70

me pueden indicar por si se puede o no y si hay alguna intruccion para yo empezar a mirar codigos

gracias a gna08 conozco la que la dircreate pude usar fechas y datos peor lo que yo neceisto ahroa es que coja parte dle bombre dle archivo para crear el folder cosa que debe ser de forma automatizada ya que son 10 a 15 archivos de estos por dia y con distintas terminacioes ,c70,b7,g5 etc etc

de antemano mil gracias :smt003

ps
me cruza por la cabeza , tal vez un filelistoArray pero como solo necesito una parte es donde me frena

Re: se puede hacer en autoit

Publicado: 25 Oct 2010, 22:48
por XPyro
Creo que te puede ser útil el código de Rupert.25 y otro que yo realice, es para crear portables pero te puede ser de utilidad a la hora de buscar carpetas y archivos.

Una parte del código que te puede interesar del programa que realice es esta donde busca archivos y carpetas:

Código: Seleccionar todo

;Función buscar - Busca y guarda en variables los archivos encontrados
Func _Buscar($Contrl, $Find, $one, $FileCoun, $Chekpro)
    $File = _FileListToArray($Find, "*", 1)
    If Not @error Then
        $Split = StringReplace($Find, $Ruta & "\", "") ;Reemplaza la ruta completa por la carpeta seleccionada
        $Line = "\"
        If $one Then
            $Split = ""
            $Line = ""
        EndIf
        ;Genera el código AutoIt para archivos
        For $A = 1 To $File[0]
            If $Chekpro Then _GUICtrlEdit_AppendText($Contrl, "GUICtrlSetData($Progress1 , " & ((100 / $FileCoun) * $Bar) & ")" & @CRLF)
            _GUICtrlEdit_AppendText($Contrl, "FileInstall(" & '"' & $Split & $Line & $File[$A] & '"' & ", $Folder & " & '"' & $Line & $Split & "\" & $File[$A] & '"' & ", 1)" & @CRLF)
            $Bar = $Bar + 1
        Next
    EndIf
    $Folder = _FileListToArray($Find, "*", 2)
    If Not @error Then
        $Split2 = StringReplace($Find, $Ruta, "") ;Reemplaza la ruta completa por la carpeta seleccionada
        ;Genera el código AutoIt
        For $B = 1 To $Folder[0]
            _GUICtrlEdit_AppendText($Contrl, "DirCreate(" & "$Folder & " & '"' & $Split2 & "\" & $Folder[$B] & '"' & ")" & @CRLF)
            _Buscar($Contrl, $Find & "\" & $Folder[$B], 0, $FileCoun, $Chekpro) ;Busca en subdirectorios
        Next
    EndIf
EndFunc   ;==>_Buscar
Puedes ver los códigos completos en:
http://www.emesn.com/autoitforum/viewto ... hilit=file
http://www.emesn.com/autoitforum/viewto ... 55&start=0


:smt006

Re: se puede hacer en autoit

Publicado: 26 Oct 2010, 00:04
por gna08
se puedee. seria leer el nombre y por ejemplo reemplazar con StringReeplaze la palabra "archivo_"...
y si. utilizar lo k dijo XPyro.. lo que hizo RUpert... para ahorrar camino diria yo xD :smt020

ve poniendio parte del code y vamos viendo k salee :smt017

Re: se puede hacer en autoit

Publicado: 26 Oct 2010, 01:27
por Chefito
Puffffff......últimamente veo que han desaparecido muchos post míos, y otros que participaron, en el cual explicaba muchas cosas. Por ejemplo, un post muy largo donde participamos varios (creo que entre ellos rupert.25 con su código), donde hice un estudio de los código que pusimos para búsqueda de archivos. Dentro de este estudio puse pruebas de velocidad.

Creo recordar que en este post se dijo y se enseño mucho sobre la recursividad. Una pena que haya desaparecido junto a otros muy interesantes :smt022 .

He buscado en mi tera externo y los he encontrado. Los cuelgo por si interesan. No es por echarme flores, pero recordar que eran de los más rápidos :smt003 :smt002 .

Codigo 1:

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiEdit.au3>
#Include <Timers.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Buscador de Archivos por Chefito", 460, 390, 193, 125, -1, 0)
GUISetBkColor(0xA0A0A4)
$Label1 = GUICtrlCreateLabel("Total de Archivos encontrados:", 8, 16, 240, 25)
GUICtrlSetFont(-1, 14, 400, 0, "Times New Roman")
GUICtrlSetColor(-1, 0x0000FF)
$Label2 = GUICtrlCreateLabel("Carpetas donde se busca el archivo", 8, 300, 435, 80)
GUICtrlSetFont(-1, 12, 600, 0, "Times New Roman")
GUICtrlSetColor(-1, 0x00f0FF)
$Input1=GUICtrlCreateInput("", 8, 48,150,22)
;$Edit1 = GUICtrlCreateEdit("", 8, 78, 441, 161, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_NOHIDESEL,$ES_WANTRETURN,$WS_HSCROLL,$WS_VSCROLL,$ES_READONLY))
$Edit1 = GUICtrlCreateList("", 8, 78, 441, 161);, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_NOHIDESEL,$ES_WANTRETURN,$WS_HSCROLL,$WS_VSCROLL,$ES_READONLY))
$Button1 = GUICtrlCreateButton("Buscar", 30, 256, 83, 33, 0)
$Button2 = GUICtrlCreateButton("Detener", 140, 256, 83, 33, 0)
$Button3 = GUICtrlCreateButton("Carpeta a buscar", 165, 48)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_Timer_SetTimer($form1, 50, "_Eventos")


Global $seguir=1,$carpeta="C:"

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
    Case $Button1   ;si pulsar comienza la busqueda del archivo.
       If GUICtrlRead($Input1)="" Then
         MsgBox(0,"Está vacio","Debes introducir el archivo a buscar")
      Else
         $seguir=1
		;_GUICtrlEdit_SetText($Edit1, "")
		$t=TimerInit()
		buscar($carpeta,GUICtrlRead($Input1))
         GUICtrlSetData($Label2,"Finalizada la busqueda")
      EndIf
      Case $Button3   ;elige el directorio donde buscar el archivo.
         $carpeta = FileSelectFolder("Elegir el directorio", "")
         If StringLen($carpeta)=3 Then $carpeta=StringLeft($carpeta,2)
         GUICtrlSetData($Label2,$carpeta)
   EndSwitch
WEnd




Func Buscar($directorio_donde_buscar,$fichero_a_buscar)
   ;FileChangeDir ($directorio_donde_buscar)
   $directorio_donde_buscar=$directorio_donde_buscar & "\"
   $search = FileFindFirstFile($directorio_donde_buscar & "*.*")
   $search2 = FileFindFirstFile($directorio_donde_buscar & $fichero_a_buscar)
   $file2 = FileFindNextFile($search2)
   While $seguir=1
    $file = FileFindNextFile($search)
      If @error Then 
         ExitLoop
      Else
      If StringInStr(FileGetAttrib($directorio_donde_buscar & $file),"D")=0 Then
            ;GUICtrlSetData($Label2,$directorio_donde_buscar & $file)

            If $file=$file2 Then
               ;_GUICtrlEdit_InsertText ($Edit1, $directorio_donde_buscar & $file & @CRLF)
			   				;MsgBox(0,"",TimerDiff($t)/1000)

			   GUICtrlSetData($Edit1,$directorio_donde_buscar & $file)
               $file2 = FileFindNextFile($search2)
            EndIf
      Else
         buscar($directorio_donde_buscar & $file,$fichero_a_buscar)
      EndIf
      EndIf
   WEnd
FileClose($search2)
FileClose($search)
EndFunc

Func _eventos($hWnd, $Msg, $iIDTimer, $dwTime)
      $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
    Case $Button2
       $seguir=0
   EndSwitch
EndFunc
Codigo 2:

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiEdit.au3>
#Include <Timers.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Buscador de Archivos por Chefito", 460, 390, 193, 125, -1, 0)
GUISetBkColor(0xA0A0A4)
$Label1 = GUICtrlCreateLabel("Total de Archivos encontrados:", 8, 16, 240, 25)
GUICtrlSetFont(-1, 14, 400, 0, "Times New Roman")
GUICtrlSetColor(-1, 0x0000FF)
$Label2 = GUICtrlCreateLabel("Carpetas donde se busca el archivo", 8, 300, 435, 80)
GUICtrlSetFont(-1, 12, 600, 0, "Times New Roman")
GUICtrlSetColor(-1, 0x00f0FF)
$Input1=GUICtrlCreateInput("", 8, 48,150,22)
;$Edit1 = GUICtrlCreateEdit("", 8, 78, 441, 161, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_NOHIDESEL,$ES_WANTRETURN,$WS_HSCROLL,$WS_VSCROLL,$ES_READONLY))
$Edit1 = GUICtrlCreateList("", 8, 78, 441, 161);, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_NOHIDESEL,$ES_WANTRETURN,$WS_HSCROLL,$WS_VSCROLL,$ES_READONLY))
$Button1 = GUICtrlCreateButton("Buscar", 30, 256, 83, 33, 0)
$Button2 = GUICtrlCreateButton("Detener", 140, 256, 83, 33, 0)
$Button3 = GUICtrlCreateButton("Carpeta a buscar", 165, 48)
_Timer_SetTimer($form1, 50, "_Eventos")

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $acabar=0,$carpeta="C:"

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
    Case $Button1   ;si pulsar comienza la busqueda del archivo.
       If GUICtrlRead($Input1)="" Then
         MsgBox(0,"Está vacio","Debes introducir el archivo a buscar")
      Else
         $acabar=0
		_GUICtrlEdit_SetText($Edit1, "")
		;$t=TimerInit()
         buscar($carpeta,GUICtrlRead($Input1))
		 										  ;MsgBox(0,"",TimerDiff($t)/1000)

         GUICtrlSetData($Label2,"Finalizada la busqueda")
      EndIf
      Case $Button3   ;elige el directorio donde buscar el archivo.
         $carpeta = FileSelectFolder("Elegir el directorio", "")
         If StringLen($carpeta)=3 Then $carpeta=StringLeft($carpeta,2)
         GUICtrlSetData($Label2,$carpeta)
   EndSwitch
WEnd


Func Buscar($directorio_donde_buscar,$fichero_a_buscar)
      $directorio_donde_buscar=$directorio_donde_buscar & "\"
      $search = FileFindFirstFile($directorio_donde_buscar & $fichero_a_buscar)
      While $acabar=0      ;si $acabar=1 no entra en el while
      $file = FileFindNextFile($search)
               If @error Then 
                  ExitLoop
			  Else
					If StringInStr(FileGetAttrib($directorio_donde_buscar & $file),"D")=0 Then
					  ;_GUICtrlEdit_InsertText ($Edit1, $directorio_donde_buscar & $file & @CRLF)   ;inserta el fichero encontrado.
					  GUICtrlSetData($Edit1,$directorio_donde_buscar & $file)
					EndIf
               EndIf
      WEnd            
         $search = FileFindFirstFile($directorio_donde_buscar & "*")
      While $acabar=0      ;si $acabar=1 no entra en el while
         $file = FileFindNextFile($search)
         If @error Then
            ExitLoop
         Else
            ;entra en este if si el resultado de $file es un archivo.
            If StringInStr(FileGetAttrib($directorio_donde_buscar & $file),"D")=0 Then
               GUICtrlSetData($Label2,$directorio_donde_buscar & $file)   ;con esta linea, se ven los directorios y los archivos.
            Else
               ;GUICtrlSetData($Label2,$directorio_donde_buscar & $file)   ;con esta linea, solo se verían los directorios.
               buscar($directorio_donde_buscar & $file,$fichero_a_buscar)   ;si es un directorio, la función se llama a sí misma y busca en ese directorio.
            EndIf
         EndIf
      WEnd
      FileClose($search)
EndFunc
   
Func _eventos($hWnd, $Msg, $iIDTimer, $dwTime)
      $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
    Case $Button2
       $acabar=1
   EndSwitch
EndFunc
Las búsquedas aceptan comodines.

La diferencia entre los dos era la forma de búsqueda. Si te digo la verdad no recuerdo mucho el código ya que fue hace tiempo :smt005 .
He visto que he puesto algunas líneas comentadas para realizar bien el estudio de velocidad. Si quitas muchas de estas, te salen en el label de abajo los directorios donde están buscando en ese momento.
También decir que mis funciones tiran solamente de funciones nativas de AutoIt. En cambio la de rupert.25 y Xpyro tiran de funciones creadas como _GUICtrlEdit_AppendText, _FileListToArray varias veces, y al hacer esto el código aumenta. Esto no quiere decir que sean más lentas, pero creo recordar que en este caso sí lo eran, y en un algoritmo de búsqueda la velocidad es muy importante. REITERO QUE DE ESTO ÚLTIMO NO ESTOY MUY SEGURO, YA QUE NO ESTÁ EL POST ORIGINAL :smt017 .

Saludos.

Re: se puede hacer en autoit

Publicado: 26 Oct 2010, 08:59
por Ximorro
Hola timistar.
A la hora de recorrer las carpetas para buscar archivos (y alguna cosa más) los compañeros ya te han puesto un montón de códigos interesantes, así que ahí poco más podría aportar.

Para tu caso concreto, a la hora de extraer el nombre de la carpeta desde el archivo es muy fácil, pues entiendo que la estructura es fija. Si siempre empiezan por "archivo_" y finalizan con ".pdf", lo único que hay que hacer es quitar esos caracteres y quedarte con lo del medio. Eso se puede hacer con las funciones StringTrimX.

Se trata pues de recortar 8 caracteres por la izquierda (longitud de "archivo_" y 4 por la derecha (longitud de ".pdf"):
$nombre_carpeta = StringTrimLeft(StringTrimRight($nombre_pdf, 4), 8)
Así por ejemplo "archivo_bodega_s6.pdf" se queda en "bodega_s6".
También se podría hacer con _StringBetween, aunque para esta simple extracción yo prefiero usar las otras funciones porque son nativas del intérprete AutoIt (funciones compiladas) y _StringBetween es una función AutoIT relativamente compleja, con lo que será bastante más lenta por ser interpretada y por hacer más trabajo del necesario (además tienes que incluir la udf string.au3, para las otras no hace falta).

Luego puedes usar DirCreate con ese nombre. Este comando funciona con paths relativos, aunque para aclararse bien a veces mejor montar el absoluto.

Re: se puede hacer en autoit

Publicado: 26 Oct 2010, 18:46
por timistar
jejeje hombre mil gracias

la verdad estaba a esto (_) de abandonar la idea pero con lo que me dices le hare de a pocos, ojo la iba a abandonar por que pense que me estaba complicando la vida mas esde mucha ayuda tu guia y la de los demas

en si lo que quiero hacer es sistematizar el archivo que tenemos en fisico en mi oficina por que es muy demorado estar imprimiendo y archivando cuando hay por lo menos 3 escanner multifunsionales disponibles y usan sharepoint para lamacenar en un servidor

y el archivo en menciosn se llamaria

b12_24024024_06515.pdf
o
b12_24024130_07835.pdf

donde el dato que yo quiero tomar es el que esta depues del b12 para que la carpeta se llame asi, osea 24024024 o 24024130 y asi progresivamente

claro que todo esto l o imple entare en enero porque añop nuevo archivo nuevo , p or ahora estoyprobando a avercom me va con tiempos y esas cosas en otro ppost p ondre algo que encontre de copair quelaverdad me parece supremamente largo para lo que debe hacer

por ahora dejemoslo alli dejame investigar y lespregunto

mi lgracias otra vez :smt038