; AutoHotkey Script pour automatiser la copie de fichiers ; Version: 5.0 - ULTRA SIMPLE - Juste copier les fichiers ; Usage: file-copier.exe (surveillance d'un fichier texte simple) #NoEnv #SingleInstance Force #Persistent ; Variables globales CatalogueDir := A_ScriptDir . "\images" CommandFile := A_ScriptDir . "\copy-command.txt" LogFile := A_ScriptDir . "\copy-log.txt" ; Créer le dossier images s'il n'existe pas FileCreateDir, %CatalogueDir% ; Simple et efficace : surveiller un fichier texte ; Interface graphique Gui, Add, Text, x10 y10 w300, Catalogue Documentaire - Copieur de Fichiers Gui, Add, Text, x10 y30 w300, Status: En attente... Gui, Add, Text, x10 y50 w300 vStatusText, Prêt à recevoir des fichiers Gui, Add, Button, x10 y80 w100 h30 gSelectFile, Sélectionner Fichier Gui, Add, Button, x120 y80 w100 h30 gOpenImagesFolder, Ouvrir Images Gui, Add, Button, x230 y80 w80 h30 gExitApp, Quitter Gui, Add, Edit, x10 y120 w300 h150 ReadOnly vLogEdit ; Afficher l'interface graphique Gui, Show, w320 h290, Catalogue - Copieur de Fichiers ; Surveiller le fichier de commande simple SetTimer, CheckCommandFile, 500 LogMessage("Script démarré - Surveillance fichier simple") return ; Vérifier le fichier de commande simple CheckCommandFile: if (FileExist(CommandFile)) { FileRead, CommandContent, %CommandFile% if (CommandContent != "") { LogMessage("Commande trouvée: " . CommandContent) ProcessSimpleCommand(CommandContent) ; Supprimer le fichier après traitement FileDelete, %CommandFile% } } return ; Traiter une commande simple (format: chemin_source|nom_destination) ProcessSimpleCommand(CommandLine) { ; Format: C:\path\to\source.tif|destination_name.tif StringSplit, Parts, CommandLine, | if (Parts0 >= 2) { SourcePath := Trim(Parts1) DestName := Trim(Parts2) DestPath := CatalogueDir . "\" . DestName LogMessage("Copie: " . SourcePath . " → " . DestPath) GuiControl,, StatusText, Copie en cours... ; Copier le fichier FileCopy, %SourcePath%, %DestPath% if (ErrorLevel = 0) { LogMessage("✓ Succès: " . DestName) GuiControl,, StatusText, Copié: %DestName% } else { LogMessage("✗ Erreur de copie") GuiControl,, StatusText, Erreur de copie } } else { LogMessage("✗ Format de commande invalide: " . CommandLine) } } ; Sélectionner et copier un fichier SelectFile: FileSelectFile, SelectedFile, 1, , Sélectionner un fichier image, Images (*.jpg; *.png; *.gif; *.svg; *.tif; *.tiff; *.bmp; *.webp) if (SelectedFile != "") { ProcessFile(SelectedFile) } return ; Traiter un fichier sélectionné ProcessFile(FilePath) { SplitPath, FilePath, FileName, FileDir, FileExt, FileNameNoExt ; Générer un nom unique NewFileName := GenerateUniqueFileName(FileName) DestPath := CatalogueDir . "\" . NewFileName ; Copier le fichier FileCopy, %FilePath%, %DestPath% if (ErrorLevel = 0) { LogMessage("✓ Copié: " . FileName . " → " . NewFileName) GuiControl,, StatusText, Dernière copie: %NewFileName% ; Notifier le navigateur via un fichier temporaire NotifyBrowser(FilePath, NewFileName) } else { LogMessage("✗ Erreur lors de la copie: " . FileName) GuiControl,, StatusText, Erreur de copie: %FileName% } } ; Générer un nom de fichier unique GenerateUniqueFileName(OriginalName) { SplitPath, OriginalName, , , FileExt, FileNameNoExt ; Nettoyer le nom de fichier CleanName := RegExReplace(FileNameNoExt, "[^\w\-_]", "_") CleanName := RegExReplace(CleanName, "_+", "_") CleanName := Trim(CleanName, "_") ; Limiter la longueur if (StrLen(CleanName) > 50) { CleanName := SubStr(CleanName, 1, 50) } Counter := 1 TestName := CleanName . "." . FileExt ; Éviter les collisions while (FileExist(CatalogueDir . "\" . TestName)) { TestName := CleanName . "_" . Counter . "." . FileExt Counter++ } return TestName } ; Notifier le navigateur NotifyBrowser(OriginalPath, NewFileName) { SplitPath, OriginalPath, OriginalName ; Créer un fichier JSON avec les informations FileAppend, ( { "timestamp": "%A_Now%", "originalName": "%OriginalName%", "newFileName": "%NewFileName%", "originalPath": "%OriginalPath%", "status": "copied" } ), %A_ScriptDir%\last-copy.json } ; Ouvrir le dossier images OpenImagesFolder: Run, explorer.exe "%CatalogueDir%" return ; Fonction de logging LogMessage(Message) { FormatTime, CurrentTime, , yyyy-MM-dd HH:mm:ss LogEntry := CurrentTime . " - " . Message . "`n" ; Ajouter au fichier de log FileAppend, %LogEntry%, %LogFile% ; Ajouter à l'interface GuiControl,, LogEdit, %LogEntry%, 1 GuiControl, Choose, LogEdit, 1 } ; Quitter l'application ExitApp: LogMessage("Script arrêté") GuiClose: ExitApp ; Raccourcis clavier globaux F12:: Gui, Show return ^!c:: ; Ctrl+Alt+C pour copier le fichier dans le presse-papiers Clipboard := "" Send, ^c ClipWait, 2 if (Clipboard != "") { if (FileExist(Clipboard)) { ProcessFile(Clipboard) } } return