Mover un archivo enumerado y por extensión

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Mover un archivo enumerado y por extensión

Post by Dsalomon » 04 Mar 2021, 02:50

Nuevamente un gustazo saludarles, como lo he comentado automatizo un canal de TV local con Scripts, ahora en AHK, por años estuve desarrollando un código que me permite enlistar a mi reproductor de video de turno, el capitulo de una serie (un archivo de video con cualquiera de estas extensiones u otras MKV, AVI, MP4), algo asi:

Carpeta Actual: %A_WorkingDir%
  • Caballeros del Zodiaco T01 - Capitulo 001.mkv
  • Caballeros del Zodiaco T01 - Capitulo 002.mvk
  • Caballeros del Zodiaco T01 - Capitulo 003.avi
  • Caballeros del Zodiaco T01 - Capitulo 004.mp4
  • Caballeros del Zodiaco T01 - Capitulo 005.avi
  • Etcétera...
y mover el archivo numerado 001 independientemente de su extensión a una subcarpeta y que tome el nombre de la carpeta actual y la renombre por ejemplo carpeta actual ~ Emitidos

en mis intentos primero definí las extensiones mas comunes que pueden tener los archivos:

Code: Select all

extensiones=mkv,doc,avi,mp4,vob
Después intente verificar que se cree la subcarpeta para donde se muevan los archivos, pero no he logrado renombrarla adecuadamente:

Code: Select all

emitidos := StrReplace(A_LoopFileName, " ~ " Emitidos")
ifnotexist, emitidos
filecreatedir, %emitidos%


al final me quede con lo básico así:

Code: Select all

ifnotexist, emitidos
filecreatedir, emitidos

continuando mi intensión mover archivos basados en formatos varios pero sobre todo en la parte numerada del archivo:

Code: Select all

Loop, %A_WorkingDir%\*.*, D
{
if A_LoopFileExt in %ext%
	FileMove, %A_LoopFileFullPath%, %A_WorkingDir%\emitidos\
}
Exit
intentente añadir una segunda condición:

Code: Select all

if A_LoopFileExt in %ext% || RegExMatch(A_LoopFileFullPath,"^\D*\d{>0}$", mayor)

quedando todo asi:

Code: Select all

ifnotexist, emitidos
filecreatedir, emitidos
extensiones=mkv,doc,avi,mp4,vob

Loop, %A_WorkingDir%\*.*, D
{
if A_LoopFileExt in %extensiones% || RegExMatch(A_LoopFileFullPath,"^\D*\d{>0}$", mayor)
	FileMove, %A_LoopFileFullPath%, %A_WorkingDir%\emitidos\
}
Exit

pero no se como decirle con RegExMach como sepa que solo mueva el 001 y al ejecutarlo otra vez mueva el 002 en ausencia del 001 y sucesivamente o si es la mejor forma de hacer un movimiento, agradecido sus correcciones y o versiones si es posible, buena madrugada.

w0z
Posts: 230
Joined: 19 Jun 2014, 08:21

Re: Mover un archivo enumerado y por extensión

Post by w0z » 04 Mar 2021, 20:39

Aca un ejemplo con GUI, adaptado a lo que describes.
Esta asignado la tecla F1, esta funcionara en un explorador de archivos, en el ultimo que tengas activo.

Code: Select all


#IfWinActive, ahk_class CabinetWClass
F1::
	if WinActive("ahk_class CabinetWClass"){

		ControlGetText, ExplorePath, ToolbarWindow323,ahk_class CabinetWClass ; A
		PathExtraido := SubStr(ExplorePath, 12) ;ingles 10 ----- espaniol 12 windows10 windows8.1

		Loop, %PathExtraido%\*.*
			count_files := A_Index

		NombreSubcarpeta := SubStr(PathExtraido, 4)
		Pathsubcarpeta := PathExtraido . "\" . NombreSubcarpeta . "_Emitidos"


		GUI_list_files(PathExtraido,count_files,Pathsubcarpeta)

		Sleep, 1000

		if WinExist("Lista Archivos"){
			ControlClick, Button3, Lista Archivos
		}
	}
Return
#IfWinActive

GUI_list_files(FolderPath,TotalFiles,RutaSubfolder){
	global MyListViewFiles
	posicion :=  "x" . A_ScreenWidth-670 . " y" . 5
	Gui, 22: new
	Gui, 22: +AlwaysOnTop
	Gui, 22: Color, 66CDAA ;00BFFF ;00CED1 ;66CDAA ;0xC0E104

	Gui, 22: Add, Text,x10 y5  h23 +0x200,Directorio Actual:  %FolderPath%           			Total Archivos: %TotalFiles%
	Gui, 22: Add, Text,x10 y25  h23 +0x200,Sub Directorio:  %RutaSubfolder%  

	Gui, 22: Add, Button,x10 y50 w90 h23 gSELECTALL_btn,Seleccionar todo
	Gui, 22: Add, Button,x120 y50 w90 h23 gDESELECTALL_btn,Deseleccionar

	Gui, 22: Add, ListView,x10 y75 r20 w400 AltSubmit Checked Sort vMyListViewFiles, Name|Size (KB) ;vMyListView  gMyListFiles

	Loop, %FolderPath%\*.*
	{
		if (A_Index = 1){
			LV_Add("Check", A_LoopFileName, A_LoopFileSizeKB)
		} else {
			LV_Add("", A_LoopFileName, A_LoopFileSizeKB)
		}
		
	}
	        
	LV_ModifyCol()  

	Gui, 22: Add, Button,x320 y50 w90 h23 gMoveFiles,Move Selected
	
	Gui, 22: Show, %posicion%  h450, Lista Archivos
	Return
}
MoveFiles:
	Gui,22: ListView, %A_GuiControl%
	RowNumber := 0  
	Arr_FileName:=[]
	Loop
	{
	    RowNumber := LV_GetNext(RowNumber,"c")  
	    if not RowNumber
	        break
	    LV_GetText(Text, RowNumber)
	    Arr_FileName.Push(Text)
	    ToolTip, %Text%
	}

	if MinIndex := Arr_FileName.MinIndex() {
		if InStr(FileExist(Pathsubcarpeta), "D"){

			for k,v in Arr_FileName
			{
				FileMove, % PathExtraido "\" v, % Pathsubcarpeta "\"
				if ErrorLevel {
					Gui,22: +OwnDialogs
					MsgBox % "Could not move " v " file into: " Pathsubcarpeta
					Return
				}
				ToolTip, Selected File %v% Moved!. ::::: Success :::::
			}
			
			SetTimer, RemoveToolTip, -3000
			Gui,22: Destroy
			; Reload
			
		} Else {
			Gui,22: +OwnDialogs
			MsgBox, 64, Nop, No existe Directorio `n Se creara el FOLDER!. , 1
			FileCreateDir, % Pathsubcarpeta
			Sleep, 500
			Gosub, MoveFiles
		}
	} Else {
		Gui, +OwnDialogs
		MsgBox, 48, Falta Seleccion, No se ha seleccionado ningun elemento de la lista!., 2
	}
Return

SELECTALL_btn:
	Gui,22: ListView, %A_GuiControl%
	LV_Modify(0, "check") ;SELECTALL
Return

DESELECTALL_btn:
	Gui,22: ListView, %A_GuiControl%
	LV_Modify(0, "-check") ;DESELECTALL
Return

RemoveToolTip:
ToolTip
return

22GuiEscape:
22GuiClose:
    Gui,22: Destroy
Return

El defecto estaria en que si tienes otros archivos como por ejemplo:
guimoveexample.jpg
guimoveexample.jpg (45.62 KiB) Viewed 1320 times
el orden lo tomaria en forma Ascendente osea de A - Z, de los nombres de los archivos.
If I was helpful consider Donate me. :beer: , plz :D

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Re: Mover un archivo enumerado y por extensión

Post by Dsalomon » 05 Mar 2021, 03:06

@w0z gracias, trataré de darle seguimiento para aumentar mi entendimiento, aunque la verdad eliminare lo grafico pues no me sirve debido a que es un proceso que solo se ejecuta una vez en determinados horarios sin intervención de usuario, si me permites colocare el código fallido que tenia en la versión BATCH DOS para que talvez se pueda emular, ante todo muy agradecido:

Code: Select all


Call :MoveNextFile "avi" "E:\series\candy" "E:\series\emitidos"
Call :PlayInWinamp "%nextFile%"
Pause&Exit /B 0
 
 
:MoveNextFile :: %1=fileExt %2=inputDir %3=outputDir var=nextFile
set "fileExt=%~1"
Set "inputDir=%~2"
Set "outputDir=%~3"
For %%# in (
	"%inputDir%\*.%fileExt%"
) Do (
	Set "nextFile=%%~f#"
	(Move "%%~f#" "%outputDir%\%%~nx#")1>NUL
	Exit /B 0
)
Goto:EOF
 
 
:PlayInWinamp :: %1=filepath %2=wampDir(Optional)
Set "filepath=%~1"
Set "wampDir=C:\Program Files\WinAmp"
If "%~2" NEQ "" (Set "wampDir=%~2")
Start /B "WinAmp" "%wampDir%\winamp.exe" "%filepath%"
Goto:EOF

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Re: Mover un archivo enumerado y por extensión

Post by Dsalomon » 13 Mar 2021, 19:58

Aquí dejo el código que al momento me funciona, seguiré con la parte de añadirlo a la lista de reproducción de Media Player Classic

Code: Select all

SetWorkingDir %A_ScriptDir% 

ifnotexist, emitidos
filecreatedir, emitidos
extensiones=avi,mp4,vob,mkv

Loop %A_WorkingDir%\*.*
	
{
	If A_Index=1
	if A_LoopFileExt in %extensiones%
	FileMove, %A_LoopFileFullPath%, emitidos\%A_LoopFileName%	
}
return

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Re: Mover un archivo enumerado y por extensión

Post by Dsalomon » 16 Mar 2021, 01:58

Aquí dejo el compilado de todo el código, he hallado varios problemas

1- No funciona con rutas con espacios entre nombres
2- por momentos no reconoce correctamente las rutas, no se a que se debe que a veces si funciona y otras no

creo que debe limpiar la memoria o ponerla a cero pero no se como se hace

Code: Select all

; COMANDOS DE MEDIAPLAYER CLASSIC: https superuser.com /questions/1121625/open-a-video-at-a-specific-time-in-media-player-classic  Broken Link for safety

; DIRECTORIO DE TRABAJO: donde esta guardado el script

SetWorkingDir %A_ScriptDir%  ; directorio actual y rutas absolutas.
;CREA LA CARPETA EMITIDOS SI NO EXISTE
ifnotexist, emitidos
filecreatedir, emitidos

Paso1_MoverCapitulo()
Paso2_CapituloSiguiente()
Paso3_AgregarPlaylist() 
ExitApp

;/////////////////////////////////////////////////////////

Paso1_MoverCapitulo(){

	Loop, Files, %A_WorkingDir%\*.* 
	If A_Index = 1  ; Selecciona el archivo con el numero mas pequeño
	If A_LoopFileExt in avi,mp4,vob,mkv
	SplitPath, A_LoopFileFullPath, file_name, dir, ext, name, drive
	Capitulo = %dir%\%name%.%ext%  ; aqui defino como Expresión
	FileMove, %Capitulo%, emitidos\%A_LoopFileName%
	return
	}
	
;/////////////////////////////////////////////////////////

Paso2_CapituloSiguiente(){
	Loop, Files, emitidos\*.*
	If A_Index>1 ; ORDEN INVERSO: Selecciona el archivo con el numero mas grande
	SiguienteCapitulo := A_LoopFileFullPath  ;Capitulo = %dir%\%name%.%ext%  ; aqui defino como Variable %%
	run, mpc-hc64.exe "/add" %SiguienteCapitulo%
	}
	
;/////////////////////////////////////////////////////////	
	
Paso3_AgregarPlaylist() {
	run, mpc-hc64.exe "/play" %SiguienteCapitulo%
}

w0z
Posts: 230
Joined: 19 Jun 2014, 08:21

Re: Mover un archivo enumerado y por extensión

Post by w0z » 16 Mar 2021, 12:24

Code: Select all

; DIRECTORIO DE TRABAJO: donde esta guardado el script

SetWorkingDir %A_ScriptDir%  ; directorio actual y rutas absolutas.

;-------------------------------------CREA LA CARPETA EMITIDOS SI NO EXISTE
emitidos := A_WorkingDir . "\emitidos"
if not InStr(FileExist(emitidos), "D"){
	FileCreateDir, % emitidos
}

Gosub, Paso1_MoverCapitulo
Gosub, Paso3_AgregarPlaylist
ExitApp

;/////////////////////////////////////////////////////////
Paso1_MoverCapitulo:

	Loop, Files, %A_WorkingDir%\*.*
	{
		If (A_Index = 1)  ; Selecciona solo el primer archivo de acuerdo al orden del nombre
		{
			If A_LoopFileExt in avi,mp4,vob,mkv,wmv
			{
				SiguienteCapitulo := emitidos "\" A_LoopFileName
				FileMove, % A_LoopFileFullPath, % SiguienteCapitulo
			}
			
		}
		
	}	

return

;/////////////////////////////////////////////////////////

;/////////////////////////////////////////////////////////	
Paso3_AgregarPlaylist:
	run, mpc-hc64.exe /play "%SiguienteCapitulo%"
Return
If I was helpful consider Donate me. :beer: , plz :D

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Re: Mover un archivo enumerado y por extensión

Post by Dsalomon » 16 Mar 2021, 22:42

Muchas gracias hasta el momento el mejor resultado, pero me llama la atención algo que viene a la misma problemática anterior del tema de los nombres

No se si soy yo o veo que el Loop, Files tiene el limite hasta la letra G

por ejemplo, cualquier archivo que inicie con la "G", "H", .... no lo mueve ni las otras letras que siguen del abecedario

w0z
Posts: 230
Joined: 19 Jun 2014, 08:21

Re: Mover un archivo enumerado y por extensión

Post by w0z » 17 Mar 2021, 06:44

lo probe con G y H me funciona normal.

Fijate que cumpla la condicion que pusiste. Si el archivo no cumple esta condicion no va mover ningun archivo. Solo lo hara si cumple con extenciones que tu pusiste en el If que son avi,mp4,vob,mkv,wmv.

Code: Select all

If A_LoopFileExt in avi,mp4,vob,mkv,wmv
If I was helpful consider Donate me. :beer: , plz :D

Dsalomon
Posts: 22
Joined: 02 Mar 2021, 23:01

Re: Mover un archivo enumerado y por extensión

Post by Dsalomon » 18 Mar 2021, 02:11

Sigue sin pasar de la letra G, probé compilar a 32 y 64 con AHK Studio y corrigió otros codigos que SciTE4AutoHotkey me daba por error, pero aun sigue allí, no se si hay que limpiar memoria o algo así, decirle al loop que llegue a mas de 500, añadir un #Include con codigo Regex /ws.* pero no me ha funcionado :(

Post Reply

Return to “Pedir Ayuda”