IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

mettre un texte dans un nouveau fichier et l'enregistrer


Sujet :

AppleScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut mettre un texte dans un nouveau fichier et l'enregistrer
    Bonjour à tous

    J'ai créé un script dans lequel je rapatrie des données et je voudrais les stocker dans un fichier texte et le sauvegarder.

    Je n'ai pas trop l'habitude d'Applescript donc j'aurais besoin d'aide, voila mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    set URL_page to "https://www.lesite.com/product-search/xx"
    set debut_texte to "Types de produits"
    set fin_texte to "Politique de confidentialité"
     
    tell application "Safari"
    	activate
    	make new document
    	tell document 1 to set URL to URL_page
    	set x to ""
    	repeat until (x ≠ "")
    		delay 15
    		set x to text of document 1
    	end repeat
    	tell document 1 to close
     
    end tell
     
    set text item delimiters to debut_texte
    set tempun to {} & text items of x
    set chainetemp to last item of tempun
    set text item delimiters to fin_texte
    set tempdeux to {} & text items of chainetemp
    set chaine to item 1 of tempdeux
    set chaine to debut_texte & chaine & fin_texte
    set Aujourdhui to current date
    --display dialog (the minute of Aujourdhui)
    set mes_heures to (time of Aujourdhui) div 3600
    set mes_minutes to ((time of Aujourdhui) mod 3600) div 60
    set HH to (mes_heures as string)
    set MM to (mes_minutes as string)
     
    tell application "Finder" to set Chemin to (home as string) & "Documents:MonDomaine:EssaiEnr-" & HH & MM & ".txt"
    -- HH correspond à l'heure actuelle
    -- MM correspond à la minute actuelle
    c'est un code récupéré sur le Net que j'ai aménagé et que je comprends

    maintenant il faudrait que je puisse enregistrer le résultat (chaine) dans un fichier.

    C'est là que ça pêche.

    a+

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Ecrire un fichier texte en Applescript se fait avec 3 instructions :
    - open : pour ouvrir le fichier et le créer si il n'existe pas déjà
    - write : pour écrire les données
    - close : pour le fermer

    Dans le script ci-dessous j'ai repris ta variable chaine en lui donnant une valeur à priori :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    set Chaine to "abcedefghij" -- la chaine du site web
    
    set HH to text 1 thru 2 of (time string of (current date))
    set MM to text 4 thru 5 of (time string of (current date))
    
    
    set monFichier to ((path to documents folder) as string) & "MonDomaine:EssaiEnr-" & HH & MM & ".txt"
    
    
    try
    open for access file monFichier with write permission-- ouvre le fichier et le crée si besoin
    write (Chaine) to file monFichier starting at eof-- écrit le message en fin de fichier    
    close access file monFicher
    on error
        try
    close access file monFichier
        end try
    end try
    Quelques commentaires :
    J'ai simplifié en 2 lignes l'extraction des heures et minutes. L'avantage de cette méthode est que l'heure est toujours sur 2 chiffres (exemple "07" au lieu de "7"). Tu verras que c'est bien plus pratique pour trier par nom dans le Finder.

    J'ai entouré les instructions d'écriture du fichier dans un block try / end try. En effet, il peut y avoir des erreurs (nom de fichier non valide, dossier protégé,...) et ce bloc try permet alors de sortir proprement du script en cas d'erreur. Note que en cas d'erreur le script saute sur le dernier "close" qui permet de toujours fermer proprement le fichier. Sinon, tu risques d'avoir un fichier resté ouvert et donc bloqué.

    Enfin, le "starting at eof" permet d'écrire dans un fichier à partir de la fin de celui-ci. Dans ton cas le fichier est nouveau donc sera vide.

    Cordialement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    PBELL bonjour,

    Matinale ta réponse, elle correspond exactement à ce que je désirais et en plus le cadrage de l'heure.
    Cà aurais été ma deuxième question mais tu m'a devancé

    Comment fait-on pour que çà s'exécute en arrière plan ?

    Autre chose n'étant pas très au fait d'Applescript, tu pourrais m'expliquer où est l'instruction qui sélectionne le texte (seul) dans le code source dans le code qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set text item delimiters to debut_texte
    set tempun to {} & text items of x
    set chainetemp to last item of tempun
    set text item delimiters to fin_texte
    set tempdeux to {} & text items of chainetemp
    set chaine to item 1 of tempdeux
    set chaine to debut_texte & chaine & fin_texte
    A+

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Citation Envoyé par patyom Voir le message
    Comment fait-on pour que ça s'exécute en arrière plan ?
    Par "arrière plan", je pense que tu veux dire "sans que cela se voit". Le traitement de la chaine et l'écriture du fichier texte n'affiche rien à l'écran. Pendant cette fraction de seconde tu peux faire autre chose avec ton Mac.
    Par contre la première partie de ton script fait appelle à Safari en lui demandant d'ouvrir un document. Cette partie sera visible.
    Si tu veux la rendre non visible à l'utilisateur, il faut plutôt utiliser des instructions de type curl en shell Unix qui vont télécharger le texte de ta page web sans rien montrer.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Chaine to do shell script "curl https://www.apple.com/fr/"
    Ici, au lieu d'utiliser Safari pour ouvrir la page du site Apple et en télécharger le contenu, l'instruction 'curl' le fait directement.
    Cette instruction est une instruction shell Unix qui est le coeur de Mac OS. On appelle les instructions Unix en Applescript via la commande 'do shell script' qui renvoie le résultat.


    Quant à ta seconde question ne connaissant pas le contenu de ton site, ce n'est pas facile de répondre. Je ne peux que t'expliquer les instructions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set text item delimiters to debut_texte
    Cette instruction permet de couper un texte en morceaux en utilisant un séparateur dans la variable debut_texte. Un exemple très simple est de mettre la variable avec un espace : le texte sera découpé en ...mots : "bonjour je vais bien" sera donc les items text "bonjour", "je", "vais", "bien".
    Mais si la variable séparateur est plus complexe, on peut aller plus loin !
    Par exemple si le séparateur est "on", le texte "bonjour" sera séparé en 2 : "b" et "jour"
    J'ajoute enfin de l'on peut définir une liste de variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set text item delimiters to {" ", ",", ".", ";"}
    Le texte sera séparé en morceaux pris entre chaque signes de ponctuation.

    Pour revenir à ton script initial, ton script coupera le texte de la page web en morceaux compris entre les chaines "Type de produits".
    Pour utiliser un de ces morceaux on utilise "item text I", soit le morceau numéro I (la série commence à 1).

    Enfin l'opérateur & est un opérateur de concaténation : Set A to "bon" & "jour" donne à A la valeur "bonjour".

    Il faut donc analyser le texte de ta page web pour déterminer comment le couper de manière efficace pour en extraire ce qui t'intéresse.
    Selon le contenu, la manipulation comme texte peut être simple ou compliquée. Parfois il faut employer d'autres méthodes (balises html, javascript,...). C'est un autre sujet !!
    Cordialement

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    Bonjour PBELL,

    l'instruction Shell colle parfaitement mais comme dans la page que je veux il y a un tableau qui se charge et avec Shell çà ne le prend pas, peut-être que c'est un peu trop rapide.

    Qu'en penses-tu ?

  6. #6
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Je ne vois pas en quoi la vitesse intervient. L'instruction curl charge la totalité de la page indiquée par l'URL, que cela soit rapide ou pas.
    Cependant, il est fort probable que ton tableau affiché ne soit pas visible comme un tableau dans le format en texte brut de la page.

    Il faudrait connaître le contenu de la page, sa structure et le tableau recherché pour pouvoir en dire plus.
    Est-ce un site public ? Si oui, peux tu transmettre l'URL ?
    Sans plus d'information, je ne peux t'aider...

    Cordialement

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    C'est un site accessible à tout le monde qui suit les cotations financières.
    Je stocke pas mal de données qui une fois traitées par mes programmes perso m'aide à comprendre un peu mieux ce monde, oh je fais çà par plaisir et surtout pour ne pas trop me faire largeur en programmation, je maintiens mes connaissances.

    çà doit surement être dans le domaine du possible, on y traite des produits comme les warrants en ce qui me concerne :

    URL : "https://www.bourse.commerzbank.com/product-search/turbos/indices%20europ%C3%A9ens/dax%2030?Barrier1Range-Min=11310.36&Barrier1Range-Max=13170.36&PageSize=100"

    https://www.bourse.commerzbank.com/p...turbos/indices européens/dax 30?Barrier1Range-Min=11310.36&Barrier1Range-Max=13170.36&PageSize=100
    Les deux passent bien

    Alors comme tu peux le voir il y a différents critères de recherche inclus dans la "phrase"
    exemple : la barrière mini (11310.36), la maxi (13170.36) et le nombre de produits à afficher (100) etc ...

    Voilà

    Merci et bonsoir

  8. #8
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Le premier URL fonctionne, pas le second. Cependant je vois sur la page du premier URL qu'il y a un bouton permettant d'exporter le tableau en fichier Excel directement. Il me semble que tes traitements ultérieurs devrait être facilité via cet export.

    En appelant les instructions javascript dans Safari, on peut demander au script de cliquer sur ce bouton. Tu récupères ensuite un fichier Excel dans ton dossier de téléchargement. Le fichier sera avec le nom "Commerzbank Product-Search.xlsx" (si tu télécharges plusieurs fois, Safari ajoute un indice avant le .xlsx).
    Pour cliquer sur ce bouton if faut trouver quel bouton appuyer et lancer un javascript.
    Le bouton "Exporter vers Excel" est le 9ème de la collection de boutons de la page (la série commence à 0). On demande donc à la console javascript de cliquer sur ce bouton dans le document 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tell application "Safari"
    activate
        tell document 1
            set A to do JavaScript "document.getElementsByTagName('button')[8].click()"
        end tell
    end tell
    L'inconvénient de cette méthode est que tout se passe de façon visible pour l'utilisateur, comme dans ton premier script.

    J'ai aussi vérifié via la method curl, mais je ne récupère que les instructions html. Donc j'abandonne.

    Enfin, j'ai aussi essayé via le text de document 1 (comme ton premier script) et il se trouver que le texte est assez simple à interpréter dans ce cas. En voici un extrait :

    x lignes inutiles avant...
    Quanto
    Prix sous-
    jacent
    C504Z DAX 30 Call 100:1 12 150,00
    Points 12 150,00
    Points 20/09/2019 44,3 2,78 2,80 Non 12 399,700
    D310Z DAX 30 Call 100:1 12 250,00
    Points 12 250,00
    Points 20/09/2019 68,1 1,80 1,82 Non 12 399,700
    ......... (n lignes identiques)

    C724Z DAX 30 Call 100:1 12 183,26
    Points 12 183,26
    Points Illimitée 51,7 2,39 2,40 Non 12 399,700
    1
    100
    articles par page

    Politique de confidentialité Avertissement

    Parser cela n'est peut être pas si simple car chaque ligne de produit n'est pas une ligne de text, mais 3 lignes de texte. Il semblerait que les mots "points" soit précédés d'un retour à la ligne. C'est possible avec quelques astuces, mais je continue de penser que l'export Excel offert par le site reste le plus pratique, le fichier Excel permettant le stockage, tous les tris et des calculs ou formule de type "if" pour détecter les variations que tu cherches.

    Cordialement

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    Je peux facilement traiter le texte dans le premier script ce n'est pas la 1ere fois que je le fais. Mon seul soucis était de le faire sans Safari n'apparaisse au 1er plan car je fais autre chose pendant ce temps là mais bon çà ne dure pas trop longtemps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tell application "Safari"
    activate
        tell document 1
            set A to do JavaScript "document.getElementsByTagName('button')[8].click()"
        end tell
    end tell
    Effectivement j'ai tout ce qu'il me faut dans ses fichiers Excel et comme je suis assez bon en VBA Excel je n'ai aucun mal à faire un amalgame. De plus c'est dans Excel facile à en faire des graphs.

    Dans tous les cas je te remercie, j'ai appris à utiliser Shell et à lancer des JavaScript d'une page Web çà c'est cool,
    çà m'ouvre pas mal de portes.

    Si je bloque en Shell de nouveau je saurai à qui m'adresser.

    Il me suffit maintenant de créer une boucle avec un timer pour que çà s'exécute automatiquement dans un laps de temps donné. As-tu déjà fait çà en AP ?

  10. #10
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Citation Envoyé par patyom Voir le message
    Il me suffit maintenant de créer une boucle avec un timer pour que çà s'exécute automatiquement dans un laps de temps donné. As-tu déjà fait çà en AP ?
    Pour lancer un script de façon répétitive, il y a plusieurs solutions:
    1) le bon view CRONTAB ! Apple n'en veut plus et réduit ses fonctions, mais sur ElCapitain ça fonctionne encore. Je crois aussi sur Mojave.
    2) en utilisant un Launchd : c'est la solution propre préconisée par Apple. Cela utilise les damons Unix. La majorité de tes applications et de ton système utilise cette méthode. Un petit tour sur le net t'en dira plus.
    3) un script appelé par ton calendrier : tu crées un évènement répétitif (par jour, semaine,...) et tu y associes un script.
    4) un script AppleScript avec un handle "idle".

    En pratique, j'utilise le 2) pour des évènement très fréquents, par exemple toutes les secondes, avec des scripts sans interface utilisateur pour ne rien montrer.

    J'utilise le 3) pour des évènements hebdomadaire , voire quotidiens (chaque jour ouvré,...). Attention toutefois, Apple est de plus en plus rigoureux avec la sécurité et lancer un script AS nécessite de l'autoriser...sinon tu auras une demande à chaque tentative de lancement. Il faut donc que ton script soit au moins compilé sous forme application .app, et l'ajouter dans tes préférences de sécurité/Accessibilité. D'autant plus que tu vas demander à ton script de prendre le contrôle de Safari !
    Apple pousse même à ce que TOUTES les application soient certifiées. Microsoft prends le même chemin.... !

    Le 4) sera lancé par toi, donc avec une seule alerte de sécurité, puis il tourne à intervalles réguliers.
    Voici un exemple que tu dois enregistrer dans l'éditeur en mode "ne pas quitter après l'exécution"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    on idle
    -- to mets ton code ici    
        return 10
    end idle
    Tu vas le lancer directement, puis à chaque fois qu'il aura fini, il attendra 10 secondes avant de se lancer de nouveau (10 = paramètre en face du return).
    Il faut cependant prévoir une sortie, sinon, il tourne à l'infini !
    Cette sortie peut être associée à des conditions dans un "if".
    Si la condition est vérifiée, tu peux dans ton code mettre un "tell me to quit". Si la condition n'est pas vérifiée, le script passe par le "return 10" et se relance 10 secondes plus tard.
    A titre d'exemple, j'avais , il y a quelques années, un script idle qui s'arrêtait lorsque j'ouvrai une application précise : le test consistait à tester si un process avec un nom donnée était lancé...si oui, je quittais. Cette application (un autre script) relançait le script idle en quittant !
    Bref , une petite bascule ;-)

    Cordialement

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    Très Très instructif, je garde..

    Allez j'ose.

    Maintenant que mes fichiers Excel sont créés avec un compteur d'incrémentation, il faut que je les renomme avec dans la clé la date et l'heure de création.

    Je n'arrive pas à extraire la date de création du fichier. J'ai beau chercher, pas un mot là-dessus.

    Une idée !

    Je continue à chercher pendant ce temps-là.

    Après quelques recherches j'ai trouver çà qui d'ailleurs marche très bien mais..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --set SomeFile to POSIX file "Macintosh HD:Users:PATRICK:Desktop:DOSSIERS Desktop:Script-AppleScript:FichCreaExcel.app"
    --set ItemInfo to (info for SomeFile)
    --Show an Open dialog box:
    set selectedFile to (choose file)
    --Get an information record for the selected file:
    set infoRecord to (info for selectedFile)
    --Get the name of the selected file:
    set fileName to the creation date of infoRecord
    --Display the file's name in a dialog box:
    display dialog ¬
    	"The name of the file you chose was " & fileName --Display a dialog box with the filename
    le "mais" c'est que on me demande de choisir un fichier mais j'ai du mal, par exemple, récupérer les infos de la 1ère ligne ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set SomeFile to POSIX file "Macintosh HD:Users:PATRICK:Desktop:DOSSIERS Desktop:Script-AppleScript:FichCreaExcel.app"
    set ItemInfo to (info for SomeFile)
    Le fichier file :Macintosh HD/Users/PATRICK/Desktop/DOSSIERS Desktop/Script-AppleScript/FichCreaExcel.app est introuvable.
    Je ne comprends pas du tout ce qui se passe.
    qu'est-ce qui ne vas pas dans ce code ?

    A force de se poser des questions on y arrive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set a to "Macintosh HD:Users:PATRICK:Desktop:DOSSIERS Desktop:Script-AppleScript:FichCreaExcel.app"
    set SomeFile to POSIX path of a
    set ItemInfo to (info for SomeFile)
    set fileDate to the creation date of ItemInfo
     
    display dialog ¬
    	"La date de création est :  " & fileDate
    Voilà A+

    Question : où as-tu trouvé cette instruction en Javascript ""document.getElementsByTagName('button')[8].click()"

  12. #12
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Citation Envoyé par patyom Voir le message
    Question : où as-tu trouvé cette instruction en Javascript ""document.getElementsByTagName('button')[8].click()"
    Il faut se pencher sur la console Javascript de Safari...et un peu "Googler".
    Chaque element d'un document (un page web) est constitué d'éléments de types divers et variés. Ces éléments ont des noms ou des noms de classe...par lesquels on peut les atteindre.
    Ce ce cas, j'ai pris les éléments par leur TagName avec la valeur 'button'). Il y a plusieurs boutons sur la page et c'est le 9ième. la série commence à 0 d'où le 8.
    Une fois sélectionné l'élément, on peut lui appliquer une méthode. Pour un bouton la méthode click() !

    Quant à la date de création de ton fichier, il y a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set A to choose file 
    tell application "System Events" to set B to creation date of A
    La première instruction n'est là que pour le test du script, afin de demander à l'utilisateur de choisir un fichier.
    C'est la seconde ligne qui assigne la date de création à la variable B.

    Tu as raison, c'est en cherchant et en se trompant que l'on mémorise le mieux...donc on progresse ! Courage.

    Cordialement

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    Bonsoir,
    J'ai un autre problème qui concerne le dossier de Téléchargements.

    Voilà.
    Dans la manip précédente le script me crée des fichiers Excel incrémentés au fur et mesure dans le fichier "Téléchargements", donc je me suis créé un autre script pour stocker les noms des dossiers en ".xlsx" liste qui me servira à recréer chaque fichier avec une nouvelle clé dans un dossier de mon domaine.

    Quand je fais tourner ce script avec un chemin autre que celui du "Téléchargements" çà fonctionne mais pas avec le chemin du dossier "Téléchargements". idem pour le dossier "Desktop".

    Il y a des interdits ?

    Comment dois-je faire pour déplacer ces fichiers ? parce qu'en plus je dois déplacer le fichier créée juste après la création car en cas d'arrêt du script au prochain lancement le compteur d'incrémentation redémarre à 0 donc il écrase les anciens fichiers. Arghhh !!!

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    J'ai trouvé ce qui ne marchais pas, j'avais une instruction de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	set liste_Fichiers to every file of entire folder of folder (choixDossier as alias) whose name ends with ".xlsx"
    Alors j'ai retiré "of entire folder" et "whose name ends with ".xlsx"
    et çà colle, je ferai le test sur ".xlsx" dans le traitement de ma liste que j'ai obtenu, plus simple pour moi.
    Je suppose qu'en mettant "of entire folder", il devait scruter tous les dossiers du dossier sélectionné donc plus long et je dépassais les limites de temps.

    Je vais me servir de "contains" pour tester l'extension de chaque fichier dans ma liste.

    au suivant ...

  15. #15
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Effectivement la gestion d'un fichier ajouté par Safari dans le dossier téléchargement peut s'avérer parfois un peu délicate.Non, il n'y a pas d'interdit dans les dossiers de ton utilisateur : tu as tous les droits.
    Les dossiers Desktop et Téléchargements sont tout à fait standard.
    Cependant, Safari gère les téléchargements, parfois an ajoutant directement le fichier, parfois en ajoutant un fichier avec une autre extension (.download) puis en remettant l'extension attendue uniquement lorsque le téléchargement est terminé.

    Cela pose un problème sur certains scripts. Par exemple si tu fais un script d'action de dossier qui se déclenche automatiquement lors de l'ajout d'un fichier. Si ce script est lié au dossier de téléchargement, il va se déclencher sur l'ajout par Safari du fichier temporaire (extension propre à Safari). Il faut donc repérer ce fichier et attendre la fin de son téléchargement pour le déplacer.

    J'avais écrit, en 2013, un article sur les actions de dossier dont la dernière partie traite justement de ce cas spécifique.
    Voir sur ce site :https://mac.developpez.com/cours/act...erapplescript/
    (attention, depuis 6 ans quelques instructions Applescript ont changé, comme celles pour ajouter des actions de dossier)

    Pour bouger un fichier d'un dossier à un autre, il faut utiliser l'instruction "move" dans le cadre du Finder (tell application "Finder" to move FichierA to folder F)
    L'inconvénient est le cette action ne fait que déplacer le fichier alors que dans la majorité des cas, on souhaite déplacer en changeant de nom. Dans ce cas le plus simple que j'ai trouvé est encore de faire appel à une instruction Unix "mv" appelée par un do shell script. Cette instruction mv per met de bouger dossier/fichierNom vers NouveauDossier/nouveauNom.

    Cordialement

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    J'ai beau cherché à comprendre "mv" je suis largué.
    ils parlent de déplacement de dossiers entiers mais pas d'1 seul fichier dans un dossier.

    Je continue !!!

  17. #17
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Tu es perdu ?
    La commande mv /dossier1/fichier1 /dossier2/fichier2 déplace le fichier "fichier1 du dossier "dossier1" vers le "dossier2" en donnant au fichier le nom "Fichier2".

    Là où ça se complique, c'est pour 2 raisons :
    D'abord les chemins Unix sont différent des chemins Finder. Ton bureau, par exemple, c'est "HD/Users/Toi/Desktop/" en Unix et c'est "HD:Users:Toi: Desktop:". Il y a des fonctions pour passer d'un format à l'autre, ce sont les fonctions POSIX. Par contre, c'est souvent une source d'erreur !
    (dans les exemples, je suppose que "Toi" est le nom de ton utilisateur et "HD" le nom de ton disque dur)

    Ensuite les commandes Unix considèrent les espaces comme des séparateurs. Donc chaque morceau sans espace est considéré comme un paramètre de la commande. Par exemple si tu as un dossier avec le nom "Mes Finances", l'instruction :
    mv HD/Users/Toi/Mes Finance/test.xslx HD/Users/Toi/Documents/Fichier.xlsx

    ne va pas copier le fichier test.xlsx de ton dossier vers ton dossier Documents avec le nom Fichier car Unix va lire 3 paramètres !!
    "HD/Users/Toi/Mes", puis "Finance/text.xlsx" et enfin "HD/Users/Toi/Documents/Fichier.xlsx"
    La commande mv est incapable de traiter cela. Fort heureusement, là encore, une instruction "quoted form of" permet de forcer l'utilisation de guillemets indiquant à Unix de lire toute partie entre des guillemets comme un seul paramètre.


    Enfin il reste une dernière subtilité sur laquelle tu pourrais passer des heures : l'utilisation de fichiers, des items Finder et des alias.
    Au début tout semble désigner la même chose pour le débutant, mais Applescript est très chatouilleux sur ces différences (à juste titre !). Je te conseille de Googler dessus, le web regorge de bonnes explications.



    In finé, comme c'est samedi et que j'ai un peu de temps, je suis suis dit que je peux rassembler pour toi tous les échanges précédents en un seul script.
    J'ai mis beaucoup de commentaires dedans pour que tu t'y retrouves et surtout pour faciliter la compréhension des lecteurs (ta demande est en fait assez récurrente sur ce forum avec toutes sortes de pages web et format de fichiers !!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    property URL_page : "https://www.bourse.commerzbank.com/product-search/turbos/indices%20europ%C3%A9ens/dax%2030?Barrier1Range-Min=11310.36&Barrier1Range-Max=13170.36&PageSize=100"
    property Dossier_Excel : "Test_Excel" -- ce dossier doit exister dans le dossier Documents
    property Nom_Fichier : "Commerzbank Product" -- nom générique des fichiers téléchargé
    
    
    -- téléchargement du fichier
    tell application "Safari"
    activate
    open location URL_page
    delay 2
    -- boucle d'attente jusqu'au chargement complet de la page
        repeat
            if (do JavaScript "document.readyState" in document 1) is "complete" then exit repeat
    delay 1 -- Attente d'une seconde avant la prochaine vérification
        end repeat
    delay 2 -- attente supplémentaire à ajuster selon vitesse Mac
    -- click sur le bouton télécharger le fichier
        tell document 1 to do JavaScript "document.getElementsByTagName('button')[8].click()"
    end tell
    
    
    delay 3 -- attente du téléchargement
    
    
    -- récupération du ou des fichiers du dossier de téléchargement dont le nom contient Num_Fichier
    tell application "Finder"
        set Source to path to downloads folder
        set Destination to ((path to documents folder) as string) & Dossier_Excel
        
        set Liste to every file of folder Source whose name contains Nom_Fichier
        repeat with fichier in Liste-- boucle sur chaque fichier
    -- definie le nouveau nom avec _aaaa_mm_dd_hh_mm.xlsx
            set nouveau_nom to Nom_Fichier & "_" & (texte_date((creation date of fichier), "_") of me) & ".xlsx"
            
    -- déplace le fichier vers le dossier destinamtion en changeant son nom
            set A to quoted form of (POSIX path of (fichier as alias))
            set B to quoted form of (POSIX path of Destination & "/" & nouveau_nom)
            try -- déplacement avec changement de nom
                do shell script "mv " & A & " " & B
            end try
            
        end repeat
    end tell
    
    
    
    
    on texte_date(La_Date, Sep) -- convertie une date en string AAAA_MM_JJ_HH_mm si le séparateur Sep = "_"
        set HH to text 1 thru 2 of (time string of La_Date)
        set MM to text 4 thru 5 of (time string of La_Date)
        set AAAA to year of La_Date
        set MMM to text -2 thru -1 of ("00" & ((month of La_Date) as integer))
        set JJ to text -2 thru -1 of ("00" & (day of La_Date))
        return (AAAA & Sep & MMM & Sep & JJ & Sep & HH & Sep & MM) as string
    end texte_date

    Tu remarques que pour faciliter la lecture, j'ai sorti sous forme de handler (une sous routine !) le formatage de la date en année_mois_jour_heure_minute.
    Là encore, une petite subtilité : l'appel de cette routine se fait avec un texte_date(date,"_") of me
    Le "of me" est pour indiquer au compilateur que le handler "texte_date" ne doit pas être cherché dans les instructions du Finder , mais dans les handlers de ce script, malgré le fait que cet appel soit à l'intérieur d'un bloc "tell application Finder" !!

    J'ai du mettre des délais d'attente dans la partie téléchargement et accès du site. Il se peut que la page soit complètement chargée, mais le bouton "export" pas encore prêt !!!...J'ai testé, en étant très rapide, cela télécharge un fichier Excel vide !!
    A toi de les ajuster en fonction de tes vitesses Internet et de ta machine. ces délais sont en secondes.


    Le script tient compte de problèmes éventuels comme le fait de n'avoir pas réussi, lors de la précédente exécution, a déplacer les fichiers hors du dossier de téléchargement. A chaque utilisation, le script reprendra TOUS les fichiers dont le nom contient "Commerzbank Product", quel que soit leur index et les déplacera avec ce nom, sans index, mais suivi des chiffres de date, heure et minute de création.



    Cordialement

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    J'ai commencé à tester ce que tu m'as envoyé, çà marche du tonnerre.
    j'avais fais les 2 premières manips, je butais sur le "mv", j'ai compris pourquoi en lisant tes explications sur les commandes UNIX.

    çà je ne pouvais pas le savoir étant donné que je ne connais pas UNIX, les commandes surtout. c'est très intéressant.

    J'ai vu que dans la partie "mv", tu fais référence "downloads folder" et "documents folder", si je voulais mettre à la place une quelconque folder
    tu l'écrirais comment parce qu'en faite je voudrais pouvoir le faire de n'importe quel dossier vers un autre dossier quelconque.

    "downloads folder" et "documents folder" sont des instructions type non ?

    Je crois que c'est la déclaration des chemins de fichiers ou de dossiers que je ne pige pas.

  19. #19
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Citation Envoyé par patyom Voir le message
    Je crois que c'est la déclaration des chemins de fichiers ou de dossiers que je ne pige pas.
    Les chemins d'accès partent de la racine du disque. Par défaut l'installation système le nomme "Macintosh HD". Ce nom peut être changé par l'utilisateur et le Mac peut être équipé de disques externes avec des noms divers.

    Ensuite, l'installation Mac OS basée sur Unix reprends toujours la même structure.
    A la racine se trouvent les dossiers System, Library (=bibliothèque), Applications et Users. J'omets volontairement ici les dossiers cachés pour simplifier.
    Dans le dossier Users (que tu vois en français comme "Utilisateurs"), il y a un dossier par utilisateur et un dossier partagé.

    Chaque dossier utilisateur porte le nom de son utilisateur (logique !), puis toujours la même structure avec les sous dossiers:
    Applications : le dossier Applications de la racine contient les applications utilisables par tous les utilisateurs, tandis que celui-ci ne contient que les applications de cet utilisateur, si il y en a. Attention, le Finder, te présente un seul dossier Applications qui regroupe les 2, mais c'est en fait bien 2 dossiers différents.
    Library (affiché comme Bibliothèque en français) : il contient des tas de fichiers propres à cet utilisateur comme ces préférences, les cookies,...Il est aussi composé de multiples sous dossiers dont la description serait trop longue ici. Par ailleurs depuis le système 10.7 (je crois ?) ce dossier est caché par défaut.

    Ensuite tu retrouves tes dossiers Bureau, Documents, Images, Musiques, Public, Téléchargement et Vidéos. Leur nom réel est en anglais, mais le Finder te les présente avec leur nom dans ta langue.

    Comme Apple et son système Unix nécessitent d'être protégés, ton utilisateur, si il n'est pas administrateur du Mac, ne peut accéder qu'à ces dossiers et leur contenu, et pas aux dossiers hors de ton dossier Utilisateur.

    La structure est immuable, mais comme le nom du disque dur et le nom de l'utilisateur est libre, il pourrait être difficile de trouver les chemins.
    Par exemple le dossier Documents sera "Macintosh HD:Users: Pierre: Documents" pour l'utilisateur Pierre, mais sur une autre machine cela pourrait être "Disque_Dur:Users:Jean: Documents".
    Note : j'ai ajouté des espaces entre les : et D pour éviter que cela soit affiché avec des smiley sur ce site, mais il ne doit pas y avoir d'espaces de part et d'autre des :


    Pour simplifier cela, Applescript contient des références toutes faites pour accéder à de nombreux dossiers : Voici les principaux (il y en a pleins d'autres !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set U10 to path to home folder
    set U11 to path to desktop folder
    set U12 to path to documents folder
    set U13 to path to movies folder
    set U14 to path to music folder
    set U15 to path to pictures folder
    set U16 to path to public folder
    set U17 to path to shared documents
    set U18 to path to downloads folder
    Parmi les autres, on peut accéder à tout les dossiers système, au dossier de l'application en cours (celui où tu as rangé ton script qui est en cours), le dossier de la poubelle, des préférences, des menus,.... bref de quoi accéder à presque tout sans connaître ni le nom du disque, ni celui de l'utilisateur.

    L'avantage est que tu peux écrire un script qui fait référence au dossier Documents de l'utilisateur et installer ce script sur n'importe quelle machine / utilisateur, il fonctionnera toujours !!


    A l'intérieur de tes dossiers Documents, Images, Vidéos,... tu es libre d'ajouter n'importe quels dossiers et sous dossiers. Dans le script, j'ai supposé que tu avais un dossier "Test_Excel" dans le dossier Documents. Ne connaissant pas le nom de ton disque ni celui de ton utilisateur, j'ai simplement utilisé le chemin "path to documents folder" et ajouté le "Test_Excel" à la fin.
    Cela donne "nom_disque:Users:Toi: Documents:Test_Excel:".
    Les ":" servent à indiquer les niveaux de dossier. Ces ":" sont traduits en Unix par des "/".

    Si tu veux mettre les fichiers Excel dans un sous dossier "Site_web" du dossier "Finances" dans le dossier Documents, tu dois juste remplacer la Property déclarée en ligne 2 par "Finances:Site_Web".
    Il faudra bien sûr que ces dossiers existent ! Si il n'existent pas, le script ne plantera pas, mais ne te dira rien, car j'ai mis l'instruction "mv" dans un bloc try, qui évite l'arrêt du script en cas d'erreur...

    La logique se poursuit avec les chemins de fichiers. Il suffit d'ajouter le mon complet du fichier avec son extension.
    "nom_disque:Users:Toi: Documents:Finances:Site_Web:Fichier_2019_07_21.xlsx" donnera accès au fichier Fichier_2019_07_21.xlsx situé dans le dossier Site_Web du dossier Finances, lui même dans le dossier Documents.

    Est-ce plus clair sur les chemins ?

    Cordialement

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 93
    Points : 52
    Points
    52
    Par défaut
    bonjour,
    on dit que la nuit porte conseil, he bien c'est le cas, avant de lire ton post j'avais effectué la modif dans le script en accolant à "Test_Excel" mon chemin et çà donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    property Dossier_Excel : "MonDomaine:BANQUES:CREDIT-AGRICOLE:Test_Excel"
    Je te remercie pour tous ces bons conseils çà m'a vraiment aidé.

    Merci et bonne journée, je te tiendrais au courant des résultats.

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2010, 18h12
  2. Réponses: 1
    Dernier message: 05/08/2010, 21h37
  3. Réponses: 1
    Dernier message: 03/04/2009, 18h23
  4. Réponses: 2
    Dernier message: 28/11/2006, 21h37
  5. [VB.Net] Comment mettre un texte dans un NotifyIcon ?
    Par Aspic dans le forum Windows Forms
    Réponses: 19
    Dernier message: 25/07/2006, 21h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo