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 :

Récupéré une variable i-1 dans une boucle [AppleScript]


Sujet :

AppleScript

  1. #1
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut Récupéré une variable i-1 dans une boucle
    Bonjour

    Je connais le php et je débute grandement dans l'applescript.
    Je souhaiterai récupérer une variable à i-1 dans une boucle faite en applescript sauf que je ne sais pas comment faire en php je fais cela
    et en applescript j'ai essayer avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set page to nbpage(i-1)
    et ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set page to nbpage[i-1]
    mais cela ne fonctionne pas pouvez vous m'aider ?

    Merci par avance

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    Par défaut
    Bonsoir,
    En Applescript, on utilise des liste au lieu de tableaux indicés
    Certains les compare entre eux et , mis à par les syntaxes, c'est très proche.
    voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Liste to {"Pierre","Paul","Jacques","Pascal}
    Set  I to 3
    Set Nom to item I of Liste  -- résultat = "Jacques" soit l'élément N° 3
    Set Nom to item (i-1) of Liste -- résultat = "Paul" soit l'élément N° 2
    Cela répond-t-il a ta question ?

    Cordialement

  3. #3
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Dans le mille !!!
    En effet c'est exactement ce que je cherchais, enfaite il va falloir que je créer une liste.

    Pour le moment j'ai cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set votreChoix to choose folder with prompt "Selectionner le dossier contenant les pdf"
     
    	tell application "Finder"
     
    		set liste_Fichiers to every file of entire contents of folder (votreChoix as alias) whose name extension is "pdf"
     
    repeat with i from 1 to (the count items of liste_Fichiers)
    set Nom to name of item i of text items of liste_Fichiers as text
     
    end repeat
    end tell
    et après il faudrait que je récupère toutes les valeurs de la variable Nom pour le mettre dans ma liste. Afin de pouvoir utilisé le fameux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Nom to item (i-1) of Liste
    Mais la création de la liste j'ai vraiment du mal j'ai regarder sur plusieurs site mais ne n'ai pas mon cas.

    Es ce que vous pouvez m'aider une dernière fois ?

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    Par défaut
    Bonjour Duffman,
    Si tu veux seulement la liste des noms, rien de plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tell application "Finder"
    	set votreChoix to choose folder with prompt "Selectionner le dossier contenant les pdf"
    	set liste_Nom to name of (every file of entire contents of folder (votreChoix as alias)) whose name extension is "pdf"
    end tell
    liste_Nom contient les noms des fichiers pdf.
    Attention toutefois, ce sont des noms, et plus des références à des fichiers, donc tu ne peux plus connaître leur type, le dossier parent, etc...
    Tout dépend de ce que tu veux en faire !

    Cordialement

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Par défaut
    Bonjour à tous

    On pourrait initialiser plusieurs variables pour récupérer les données qu'on désire des éléments cibles, comme le nom, la taille, la date de modification, etc., cela donnerait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tell application "Finder"
    	set votreChoix to (choose folder with prompt "Selectionner le dossier contenant les pdf") as alias
    	set liste_docs to ((every file of entire contents of folder votreChoix) whose name extension is "pdf") as alias list
    	set liste_noms to name of ((every file of entire contents of folder votreChoix) whose name extension is "pdf")
    	set liste_tailles to size of ((every file of entire contents of folder votreChoix) whose name extension is "pdf")
    	set liste_dates to modification date of ((every file of entire contents of folder votreChoix) whose name extension is "pdf")
    end tell
    return {liste_docs, liste_noms, liste_tailles, liste_dates}
    Ce code fonctionne plutôt bien, sauf que, en l'état, il demande au "Finder" de lire 4 fois des données sur les mêmes fichiers, ce qui est le traitement le plus long en réalité car cela impose de parcourir et filtrer autant de fois la même arborescence sur le disque.

    Il existe une commande très intéressante qui peut nous éviter de faire autant de fois les mêmes traitements de ce type, il s'agit de la commande "a reference to", qui permet de conserver dans une variable les identifiants aux objets qu'on souhaite manipuler.

    En utilisant cette commande, le code précédent donnerait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tell application "Finder"
    	set votreChoix to (choose folder with prompt "Selectionner le dossier contenant les pdf") as alias
    	set liste_ref to a reference to ((every file of entire contents of folder votreChoix) whose name extension is "pdf")
    	set liste_docs to (liste_ref as alias list)
    	set liste_noms to (name of liste_ref)
    	set liste_tailles to (size of liste_ref)
    	set liste_dates to (modification date of liste_ref)
    end tell
    return {liste_docs, liste_noms, liste_tailles, liste_dates}
    Ici nous avons une seule lecture filtrée de l'arborescence, on mémorise ce résultat sous forme de références dans la variable "liste_ref" qu'on utilise par la suite pour récupérer les autres infos nécessaire de chaque fichier.

    Ce bout de code nécessite néanmoins un petite modification pour éviter le bug de la conversion "as alias list" qui produit une erreur lorsque la liste ne contient qu'un seul élément, il faut donc passer par une structure conditionnelle ou de contrôle pour gérer ce cas de figure, ce qui pourrait donner :

    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
    tell application "Finder"
    	set votreChoix to (choose folder with prompt "Selectionner le dossier contenant les pdf") as alias
    	set liste_ref to a reference to ((every file of entire contents of folder votreChoix) whose name extension is "pdf")
    	if ((count liste_ref) > 1) then
    		set liste_docs to (liste_ref as alias list)
    		set liste_noms to (name of liste_ref)
    		set liste_tailles to (size of liste_ref)
    		set liste_dates to (modification date of liste_ref)
    	else
    		set liste_docs to {} & (liste_ref as alias)
    		set liste_noms to {} & (name of liste_ref)
    		set liste_tailles to {} & (size of liste_ref)
    		set liste_dates to {} & (modification date of liste_ref)
    	end if
    end tell
    return {liste_docs, liste_noms, liste_tailles, liste_dates}
    Voilà, j'espère que ce petit apport pourra être utile

  6. #6
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Super explication comme toujours.
    Enfaite je vais expliquer ce que je veux faire,
    j'ai fais un script qui permet de lister tous les pdf d'un dossier en récupérant dans un fichier csv le nom du fichier, le nombre de page.
    Dans mon script je voudrais ajouter une nouvelle colonne à mon fichier csv qui est Page.
    Page correspond au nombre de page du fichier lister précédemment en lui ajoutant le fichier lister à l'instant.
    exemple :
    Nom du fichier / Nombre de page / Page
    fichier1.pdf / 10 / 10
    fichier2.pdf / 5 / 15
    fichier3.pdf / 6 / 21

    Voici mon code (en gras se que j'ai ajouté pour essayer de faire apparaitre les valeurs de Page)

    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
    56
    set votreChoix to choose folder with prompt "Selectionner le dossier contenant les pdf"
    
    set listeNoms to ""
    
    set pointvirgule to ";"
    
    set info to ""
    
    
    set nomdufichier to "Nom du fichier;Nombre de page;Page
    "
    
    
    
    with timeout of 0 seconds
    	tell application "Finder"
    		
    		set liste_Fichiers to ((every file of entire contents of folder (votreChoix as alias)) whose name extension is "pdf")
    		
    		
    		
    		repeat with i from 1 to (the count items of liste_Fichiers)
    			
    			set Nom to name of item i of text items of liste_Fichiers as text
    			set chemin_Fichier1 to (votreChoix as text) & Nom as text
    			set aFilePosix to quoted form of POSIX path of chemin_Fichier1
    			set theResult to (do shell script ("mdls -name kMDItemNumberOfPages " & aFilePosix))
    			set theResult to text (2 + (offset of "=" in theResult)) thru -1 of theResult
    			set nbpage to theResult as string
    			if nbpage is "(null)" then set nbpage to 0
    			set p to i - 1
    			if p = 0 then set page to 0
    			if p > 0 then set page to nbpage + (page of item p)
    			
    			
    			set listeNoms to listeNoms & Nom & pointvirgule & nbpage & pointvirgule & page & pointvirgule & return
    			
    			
    			
    			set chemin_Fichier to (votreChoix as text) & " Fichiers.csv" as text
    			
    		end repeat
    		
    		try
    			set chemin_Fichier to open for access chemin_Fichier with write permission
    			set eof chemin_Fichier to 0 -- Pour éffacer le contenu du fichier
    			write nomdufichier starting at eof to chemin_Fichier
    			write listeNoms starting at eof to chemin_Fichier
    			close access chemin_Fichier
    		on error
    			close access chemin_Fichier
    		end try
    		
    		
    	end tell
    end timeout

  7. #7
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    Par défaut
    Bonsoir Duffman,
    j'ai 4 commentaires sur ton script :
    1) il ne fonctionne pas lorsqu'un fichier est dans un sous dossier du dossier choisi. Exemple Dossier "A" qui contient le dossier "A1" qui contient le PDF "Fichier.PDF". En effet tu exécutes alors le do shell avec "A/Fichier.PDF" au lieu de "A/A1/Fichier.PDF"... Réponse du Terminal "file not found !"

    2) au lieu d'utiliser des boucles sur indice, on peut utiliser des repeat with, plus élégants (mais, je te l'accorde, même résultat)

    3) l'extraction du nombre de pages peut se faire plus joliment en prenant le 3ème mot de la réponse du terminal (format = "kMDItemNumberOfPages = x")

    4) ta méthode de calcul du nombre cumulé de pages peut être simplifiée en prenant 0 au départ et en ajoutant simplement le nombre de pages du fichier en cours à la valeur cumulée.

    Je te propose le script suivant qui tient compte des 4 remarques :
    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
    set votreChoix to choose folder with prompt "Selectionner le dossier contenant les pdf"
     
    set pointvirgule to ";"
    set nomdufichier to "Nom du fichier;Nombre de page;Page
    "
    set chemin_Fichier to (votreChoix as text) & " Fichiers.csv" as text
     
    with timeout of 0 seconds
    	set Cumul to 0
    	set Mon_Texte to ""
    	tell application "Finder"
    		set liste_Fichiers to ((every file of entire contents of folder (votreChoix as alias)) whose name extension is "pdf")
    		repeat with Fichier in liste_Fichiers
    			set Nom to name of Fichier
    			set Chemin to (container of Fichier) as string
    			set S to quoted form of POSIX path of (Chemin & Nom)
    			set theResult to (do shell script ("mdls -name kMDItemNumberOfPages " & quoted form of POSIX path of (Chemin & Nom)))
    			set Nb_Page to (word 3 of theResult) as integer
    			set Cumul to Cumul + Nb_Page
    			set Mon_Texte to Mon_Texte & Nom & pointvirgule & Nb_Page & pointvirgule & Cumul & pointvirgule & return
    		end repeat
     
    		try
    			set chemin_Fichier to open for access chemin_Fichier with write permission
    			set eof chemin_Fichier to 0 -- Pour éffacer le contenu du fichier
    			write nomdufichier starting at eof to chemin_Fichier
    			write Mon_Texte starting at eof to chemin_Fichier
    			close access chemin_Fichier
    		on error
    			close access chemin_Fichier
    		end try
     
     
    	end tell
    end timeout
    Je suis curieux : pourquoi as tu mis un bloc timeout ?
    Merci beaucoup pour l'instruction mdls que je ne connaissais pas: très utile...on aprend tous les jours

    Cordialement

  8. #8
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Merci beaucoup.
    Enfaite les pdf qui serait dans un sous dossier ne doivent pas être lister enfin ce n'est pas grave.
    Et le timeout c'est parce que j'ai des dossiers de plus de 500 pdf et le temps de traitement peut être très long.
    Sans le with timeout of 0 seconds mon script s'arrete et m'indique que le délai d’exécution est dépassé.

    En tout cas merci encore une fois pour cette aide qui m'est bien précieuse.

  9. #9
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    Par défaut
    Bonjour,
    si tu ne veux que les fichiers du dossier choisi et pas les contenus des sous dossiers (donc seulement le premier niveau de l'arborescence), il suffit de retirer "of entire content of" dans la ligne 12 du script et ta liste sera limitée aux seuls fichiers PDF de premier niveau.

    De plus l'exécution sera grandement accélérée !

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/01/2015, 00h57
  2. Réponses: 1
    Dernier message: 26/12/2010, 22h20
  3. Réponses: 3
    Dernier message: 06/09/2006, 10h06
  4. [PHP-JS] Passer une variable PHP->JS dans une boucle
    Par PedroBD dans le forum Langage
    Réponses: 2
    Dernier message: 12/05/2006, 12h43
  5. [VB.NET] lien d'une base de donnée dans une variable
    Par Anubis666 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/01/2006, 11h56

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