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 :

Connaitre l'extension d'un fichier quand on a Chemin:NomFichier sans l'extension (pour inclure dans du VBA) [AppleScript]


Sujet :

AppleScript

  1. #1
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut Connaitre l'extension d'un fichier quand on a Chemin:NomFichier sans l'extension (pour inclure dans du VBA)
    Bonjour PBELL ,

    Je vais essayer d'être le plus clair possible.
    Dans Excel je vais me retrouver avec une colonne comportant que des noms de fichiers avec ou sans extensions.

    Lorsque ma boucle tombera sur le nom d'un fichier sans extension, je ne pourrais pointer sur ce fichier car :
    mon chemin dans Excel se présentera de cette manière :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    "Macintosh HD:Users:NomUser:Desktop:DeveloppezCom:Renommage:Images:LeNomDeMonFichier"
    l'extension étant sous entendu/non affiché visuellement dans le finder (LeNomDeMonFichier.Extension)

    Or le nom reconnu dans le code VBA d'Excel sera le nom avec son extension. Si je ne trouve pas le moyen d'ajouter cette Extension j'ai une erreur et je ne peux traiter le fichier.

    Donc en ayant ce chemin (ou un autre peu importe) :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    "Macintosh HD:Users:NomUser:Desktop:DeveloppezCom:Renommage:Images:LeNomDeMonFichier"
    comment puis je faire pour récupérer l'extension quelle qu'elle soit ??

    En attendant je continue de chercher …

    Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  2. #2
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bon j'ai une piste mais ce n'est pas nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set myFolder to (choose folder)
    set pFolder to POSIX path of myFolder
    set folderNames to paragraphs of (do shell script "find " & quoted form of pFolder & " -name \"NomDuFichier.*\"") as text
    Cela me retourne (à noté un slash en trop à la fin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/Users/NomUser/Desktop/DeveloppezCom/Renommage/Images//NomDuFichier.jpg"
    j'aimerais plutôt en retour :
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  3. #3
    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 plus simple est de convertir la string renvoyée par le find en alias de fichier.
    Cela te permettra directement d'accéder à son nom, son extension, voire à son contenu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set MonChemin to "/Users/imac27/Desktop/Test.jpg" -- c'est un paragraphe de la string de retour du find 
    set MonFichier to (POSIX fileMonChemin) as alias
    tell application "System Events" to set MonNom to name of MonFichier
    Sinon, l'autre possibilité, si tu cherches un fichier dans un dossier donné qui ne contient pas trop de fichiers, c'est d'utiliser un "get every file whose name contains xxx".
    Sur des gros dossiers, le "find" est plus rapide, mais sur des dossiers de moins de 1000 fichiers, tu obtiens directement les alias vers les fichier concernés.

    Cordialement

  4. #4
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,
    Merci de ta réponse, le problème est que dans le fichier Excel (+ le code VBA pour le chemin du dossier concerné) je n'aurai pas forcément l'extension sur les noms de la colonne noms;
    ce qui voudra dire que le code devrai se présenter comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set MonChemin to "/Users/NomUser/Desktop/DeveloppezCom/Renommage/Images/NomDuFichier" -- sur NomDuFichier il n y a pas l'extension comme cela : NomDuFichier.Extension
    set MonFichier to (POSIX file MonChemin) as alias
    tell application "System Events" to set MonNom to name of MonFichier
    Ce qui provoquera une erreur !

    Par contre la solution avec "get every file whose name contains xxx" à l'air intéressante,
    Peux tu me donner un exemple concret d'utilisation ? et du find aussi en pure applescript (sans "do shell script") ? stp
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  5. #5
    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 code que j'ai donné ce matin devait se mettre après ton "do shell script 'find..' ". Dans ta version précédente, tu avais des lignes de résultats que tu lisais via un paragraph of....
    En d'autres termes, c'est l'item 1 of foldernames de ton script qui doit être utilisé dans la variable MonChemin de mon morceau de script ce matin.

    Quant à l'utilisation du get every fille whose name contains... en voici un exemple.
    Je suis encore parti de ton chemin Unix (séparateurs /) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set Dossier to ((POSIX file "/Users/imac27/Desktop/exemples/") as string) as alias
    tell application "Finder" to set FListe to every file of Dossier whose name contains "xxx"
    La première ligne demande des explications:
    1) ton chemin de départ est une string représentant un chemin avec des /.
    2) je la convertie donc en chemin "Finder" avec des séparateurs ":" via le "posix file". J'obtiens un alias de fichier alors que c'est un folder. C'est pourquoi je reconvertie le résultat en string avec le "as string"
    3) je reconverti ensuite cette string en véritable alias (ici de dossier et pas de fichier) avec le "as alias".

    Le "xxx" peut contenir n'importe quelle suite de caractères. Tous les fichiers dont le nom contient cette suite seront dans la liste résultante Liste.
    Par exemple si tu remplaces "xxx" par "montagne", les fichiers suivants seront sélectionnés:
    - montagne.jpg
    - la belle montagne.xls
    - la belle montagne blanche.txt
    - etc

    En revanche le fichier "la mont agne.xls" ne sera pas sélectionné car l'espace inséré rend la chaîne différente.

    J'ajoute que la fonction "whose" accepte des logiques plus complexes: "whose (name contains "montagne") and (name contains ".xls") sélectionnera les fichiers dont le nom contient à la fois "montagne" et ".xls", l'extension faisant partie du nom !
    Avec liste de l'exemple précédent, seul "la belle montagne.xls" sera dans la liste Liste

    Cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    re,
    autant pour moi j'ai mal compris le 1er message maintenant c'est plus clair,
    je vais tester tout ça.
    merci
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  7. #7
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    ça marche nickel

    Par contre, Je me rends compte que les allers-retours entre VBA et AppleScript (code lancer en VBA avec MacScript) mettent un temps non négligeable;

    Donc ce que j'aimerai faire pour pallier à cela c'est envoyer une liste de Excel vers AppleScript par l'intermédiaire de MacScript :
    - sous quel forme dois je mettre la liste texte fait par Excel pour l'envoyer à AppleScript ?
    - l'idée et que tout soit traiter en une seule fois par AppleScript pour le renvoyer à Excel


    Imaginons une liste (peu importe les extensions, le principal c'est que je récupère tous les noms des fichiers avec leurs extensions) - schématiquement :

    envoyé d'Excel :
    Liste(image1, image2, image3.jpg, image4, image5.psd, image6.tiff, image7, …)

    Résultat récupéré par Excel via MacScript (AppleScript) :
    Liste(image1.jpg, image2.eps, image3.jpg, image4.psd, image5.psd, image6.tiff, image7.jpg, …)

    au niveau du code je vois bien qq chose, à peu près, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set myFolder to (choose folder)
    set pFolder to POSIX path of myFolder
    set myList to {"1", "2", "3"} -- Ma liste provenant d'Excel => sous quel forme ?? Comme cela : "1", "2", "3"
    -- set AppleScript's text item delimiters to return
    set TheNewlist to {}
    repeat with theItem in myList
    	set end of TheNewlist to (do shell script "find " & quoted form of pFolder & " -name " & theItem & "\".*\"") as text
    end repeat
    set AppleScript's text item delimiters to return
    return TheNewlist as text
    -- je ne sais pas si c'est mieux de récupérer le résultat sous forme de list ou via un delimiters avec return
    je réussi à faire cela ci-dessus - peut-on faire plus simple pour le même résultat ??
    Quel serai la meilleure méthode, vois tu d'autres suggestions ??

    Autres questions comment fait-on si on ne veux pas récupérer NomDuFichier.Extension mais seulement .Extension ??

    Ryu

    Edit j'ai oublié, peut être faut-il prévoir une gestion d'erreur dans le cas où un fichier n'existerait pas et remplacer le résultat avec "le fichier n'existe pas" ou autre … ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  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
    Bonsoir,
    Pour transférer des listes entre VBA et Applescript, je vois 2 méthodes:
    - via l'écriture dans via d'un fichier texte,
    - en construisant les listes dans l'Applescript.

    La première méthode est sans doute la plus pertinente, surtout dans le cas de longues listes:
    1) en VBA tu prépares un workbook avec une liste de A1 à Axx
    2) tu enregistres ce workbook au format txt (tab delimiter) dans un directory temporaire. Eventuellement tu transmets le chemin du fichier de VBA à Applescript
    3) le script Applescript lit le fichier texte en le décomposant en paragraphes (le premier paragraphe à la valeur de A1, le second de A2,...)
    4) Une fois l'applescript exécuté, il peut écrire les résultats dans le même fichier (remettre le EOF à 0 pour réécrire dessus), toujours avec une ligne par résultat
    5) VBA lit le fichier sous forme de workbook (il connait déjà le chemin et le nom !)
    Il y a plusieurs avantages:
    Les listes ne sont limitées que par le nombre de lignes d'Excel (65.535 ou 1.000.000 selon les versions)
    Il est préférable d'avoir un VBA séparé de l'Applescript, ce qui est plus facile pour la maintenance et la mise au point dans chaque environment.
    Enfin, cela te permettrait d'avoir un fichier texte de retour avec 5 colonnes si nécessaire: le nom d'origine envoyé par VBA, le nom réel avec son extension, son extension, son chemin et enfin un statut "existe O/N". Ce tableau étant très facilement utilisable dans Excel !


    Si la liste est relativement courte et si le contexte oblige à avoir le script Applescript dans VBA directement, alors la seconde méthode peut aussi être utilisée.
    En voici un exemple VBA avec de nombreux commentaires:
    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
    Sub Macro1()' test envoie d'une liste à Applescript
    Dim myAS As String
    CR = Chr$(13)
    GU = Chr$(34)
    Sep = "," ' virgule comme séparateur de liste
    vbalist = GU & "test1" & GU & Sep & GU & "test2" & GU & Sep & GU & "Test3" & GU ' prepare la liste
    
    
    ' construit le script AS
    myAS = "set ASList to " & "{" & vbalist & "}" ' la varialbe ASList est une liste dans Applescript
    myAS = myAS & CR & "display dialog (item 2 of ASList)" ' exemple de display AS sur l'item 2 de la liste
    myAS = myAS & CR & "set text item delimiters to " & GU & "," & GU
    myAS = myAS & CR & "return ASList as text" ' renvoie de AS vers VBA de la liste
    ListeRetour = MacScript(myAS) ' retour dans VBA dans la variable ListeRetour
    MsgBox temp
    End Sub

    Quant aux autres questions purement Applescript:
    - l'extension s'obtient, dans un bloc "tell Finder" via l'instruction: name extension of F (dans laquelle F est un avis de fichier)
    - le test d'existence se fait aussi dans un bloc "tell Finder" via l'instruction: if F exists then ...

    Cordialement

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Merci pour tout cela je vais regarder le tout de près

    Par contre j'ai une question qui me turlupine,

    Dans le cas où je ne passe pas par un fichier text, tu me dis que la liste doit être relativement courte. Qu'elle en est la raison ??
    Car en vba je peux créer automatiquement une Variable text via un tableau ou une plage se présentant comme cela :

    MaVariableText = ""nom1","nom2","nom3","nom4",… etc"
    que je pourrai intégré dans l'applescript directement dans la list comme dans ton code "{" & MaVariableText & "}",
    mais avec une méthode auto vba pour créer la liste

    en VBA pour ce faire j'aurais par exemple :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub VarText()
    Dim MaVariableText$, Plage, DL&
        DL = Cells(Rows.Count, 2).End(xlUp).Row
        Plage = Range("B3:B" & DL).Value
        MaVariableText = """" & Join(Application.Transpose(Application.Index(Plage, 0, 1)), """, """) & """"
    End Sub
    de cette manière la liste peut se construire automatiquement … et là la liste peut être suffisamment grande

    qu'en penses tu ?? c'est faisable ? ou penses tu qu'une telle solution peut apporter des soucis ??

    Edit : j'ai fait le test avec :
    Code vba : 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
    Sub Macro1() ' test envoie d'une liste à Applescript
    Dim myAS As String
    CR = Chr$(13)
    GU = Chr$(34)
    Sep = "," ' virgule comme séparateur de liste
    'vbalist = GU & "test1" & GU & Sep & GU & "test2" & GU & Sep & GU & "Test3" & GU ' prepare la liste
    DL = Cells(Rows.Count, 2).End(xlUp).Row
    vbalist = """" & Join(Application.Transpose(Application.Index(Range("B3:B" & DL).Value, 0, 1)), """, """) & """"
     
     
    ' construit le script AS
    myAS = "set ASList to " & "{" & vbalist & "}" ' la varialbe ASList est une liste dans Applescript
    myAS = myAS & CR & "display dialog (item 10 of ASList)" ' exemple de display AS sur l'item 2 de la liste
    myAS = myAS & CR & "set text item delimiters to " & GU & "," & GU
    myAS = myAS & CR & "return ASList as text" ' renvoie de AS vers VBA de la liste
    ListeRetour = MacScript(myAS) ' retour dans VBA dans la variable ListeRetour
    MsgBox ListeRetour 'temp
    End Sub
    et c'est OK

    par contre je bug sur ce code je dois avoir une erreur sur la ligne 7 (là où il y do shell script) mais je n'arrive pas à trouver :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test2()
     
        Dossier = "Macintosh HD:Users:KAB:Desktop:DeveloppezCom:Renommage:Images:"
        vbalist = """" & Join(Application.Transpose(Application.Index(Range("B3:B5").Value, 0, 1)), """, """) & """"
        ListRetour = MacScript("set pFolder to POSIX path of " & Dossier & Chr(13) & "set myList to " & "{" & vbalist & "}" & Chr(13) & "set TheNewlist to {}" & Chr(13) & _
                                                "repeat with theItem in myList" & Chr(13) & _
                                                "set end of TheNewlist to (do shell script ""find " & "'" & pFolder & "'" & " -name " & theItem & ".*"")  as text" & Chr(13) & _
                                                "end repeat" & Chr(13) & "set AppleScript's text item delimiters to return" & Chr(13) & "return TheNewlist as text")
     
    End Sub

    Edit 2 : d'ailleurs je me rends compte, il est plus facile pour moi d'intégrer de l'AppleScript seul dans un MacScript que d'intégrer le mélange AppleScript et do Shell script …
    Aurais tu des règles d'utilisation ou des conseils pour mettre les guillemets au bon endroit lorsque j'intègre de l'applescript avec do Shell script dans un MacScript stp ?
    Merci d'avance

    Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  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,
    Pour ce qui est du mode liste, je ne sais pas exactement le mécanisme interne de passage de VBA vers AS, mais je pense que le script text de VBA est envoyé intégralement à l'interpréteur /compilateur AS. Si la liste est longue, cela mets sans doute plus de temps, car ce n'est pas un pointeur vers une liste qui est envoyé, mais une string.
    Hormis ce point, les strings VBA sont, je crois, limitées à 255 caractères (pas sûr !). Dans AS, bien qu'il existe 2 classes, text et string, le compilateur s'arrange et le texte est, illimité sauf à la mémoire de travail d'AS.

    Pour le bug de la ligne 7, c'est une des difficultés d'intégrer l'AS dans le VBA. Il n'y a pas de pré-compilation et les erreurs sont difficiles à trouver.
    A l'exécution, le code renvoie une erreur sur l'ensemble du script AS et tu restes aveugle.
    Avec un AS séparé qui reçoit un fichier texte, tu peux débuger bien plus facilement

    Pour l'erreur en ligne 7, je te conseille de passer par une variable S dans VBA, dans laquelle tu assignes tes instructions AS. Il suffit ensuite de faire un "Macsript(S)".
    L'avantage est que tu peux mettre un point d'arrêt en VBA avant le Macscript et, lors de l'arrêt, vérifier la valeur de S. Tu pourras ainsi voir les problèmes de guillemets (je crois aussi que c'est là qu'est le problème). Lors de mes essais, en fait je copiais cette valeur de la fenêtre de visualisation VBA vers une fenêtre de l'éditeur AS. Je pouvais ainsi compiler directement la partie AS et vérifier les erreurs de compilation et la syntaxe.

    L'instruction doit être : do shell script "xxxx". Les guillemets sont indispensables. Donc dans VBA ce sont des doubles guillemets.

    Par ailleurs, lors d'un shell script, il faut se souvenir que les espaces sont des séparateurs de paramètres.
    Donc si ton nom de dossier est "dossier sans titre", la commande shell verra 3 paramètres, un par mot. Pour contourner le problème, il faut utiliser le "quoted forme of".
    Cela revient à encadrer , pour la commande shell, la variable qui suit avec les guillemets adéquats.
    Par exemple : quoted form of pFolder acceptera le chemin/nom du dossier avec les espaces et caractère spéciaux. Idem pour la variable theItem.

    J'avais commencé à t'écrire un script AS acceptant comme variable un chemin/nom de fichier (le fichier contenant en ligne 1 le dossier des recherches et les lignes suivantes les noms). Ce script renvoie le même fichier text au format text tab delimiter avec, sur chaque ligne : le nom initial, le nom du fichier si trouvé, le nom de son extension et un statut "existe /introuvable". Je mets cela de côté.

    Cordialement

  11. #11
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir,

    pour un simple do shell script
    j'avais remplacé le signe du quoted form => '
    en faisant cela dans un test :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ShellOpenFolder()
    Dim Chemin$
    Rept = "Macintosh HD:Users:KAB:Desktop:Excel:COPIER:EXCEL +++:Excel:RECHERCHE DECAL:"
    'MsgBox Replace(Right(Rept, Len(Rept) - InStr(Rept, ":") + 1), ":", "/")
    Chemin = Replace(Right(Rept, Len(Rept) - InStr(Rept, ":") + 1), ":", "/")
    MonScript = "do shell script ""open " & "'" & Chemin & "'" & Chr(34)
    MacScript (MonScript)
    End Sub
    et qui a très bien marché vu que le signe "+" et l'espace devrait poser problème

    il est vrai qu'il y a une limitation mais je ne suis pas sur au niveau du string;
    j'avais fait ce code (encore quelque points à améliorer) mais dont le résultat peut être relativement grand :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub liste()
    Dim Chemin$
    Columns(1).Clear
    Chemin = "Macintosh HD:Users:KAB:Downloads:" 'Selection.Value "Macintosh HD:Users:KAB:Desktop:DoublonsOK2:RECHERCHE COMPLEXE"Downloads
    Chemin = Replace(Right(Chemin, Len(Chemin) - InStr(Chemin, ":") + 1), ":", "/") & "/"
    'Debug.Print MacScript("do shell script ""ls " & "'" & Chemin & "'" & Chr(34))
    T = Timer
    TOTO = Split(MacScript("do shell script ""ls -R " & "'" & Chemin & "'" & Chr(34)), vbCr)
    Range("A1").Resize(UBound(TOTO)) = Application.Transpose(TOTO)
    MsgBox Format(Timer - T, "0.000 s")
    End Sub

    J'ai fait un test avec la reprise de ton code en post 8 et vbalist = """" & Join(Application.Transpose(Application.Index(Range("B1:B" & DL).Value, 0, 1)), """, """) & """"
    j'ai mis des chiffres dans la colonne B de 1 à 2000 en rajoutant "MonText" ce qui donne "1MonText", …, "2000MonText"
    c'est passé sans problème, après si on commence à aller au delà je pense que ça peu poser souci

    comme d'habitude les informations que tu me fournis sont claires précises et précieuses

    Je vais continuer à bucher …

    PS : Dans le post #8 je trouve assez alléchant l'idée de la 1ère méthode :
    La première méthode est sans doute la plus pertinente, surtout dans le cas de longues listes:
    1) en VBA tu prépares un workbook avec une liste de A1 à Axx

    … …
    Il est préférable d'avoir un VBA séparé de l'Applescript, ce qui est plus facile pour la maintenance et la mise au point dans chaque environment.
    Enfin, cela te permettrait d'avoir un fichier texte de retour avec 5 colonnes si nécessaire: le nom d'origine envoyé par VBA, le nom réel avec son extension, son extension, son chemin et enfin un statut "existe O/N". Ce tableau étant très facilement utilisable dans Excel !
    Edit : Bon du nouveau, j'ai fait un test vite fait, car en journée pas possibilité de faire du code, avec dans la colonne B : "1Montext" à "60000Montext" => 60000 cellules dans Excel
    Si tu te rappelles de ma fonction GetOpenFilename dans ma discussion précédente, j'étais passé par le presse papier pour récupérer le résultat.
    J'ai fait de même et c'est ok

    donc ici c'est juste pour le passage de Excel => applescript => Excel (le code n'est pas propre)
    pour les données sur un nouveau classeur :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub donnees()
    Range("B1:B6000").FormulaLocal = "=LIGNE()& ""MonText"""
    Range("B1:B6000").Value = Range("B1:B6000").Value
    End Sub
    Pour le Passage de Excel => applescript => Excel :
    Code vba : 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
    Sub Macro1() ' test envoie d'une liste à Applescript
    Dim myAS As String, MyPaths As String, PP As New MSForms.DataObject
    CR = Chr$(13)
    GU = Chr$(34)
    Sep = "," ' virgule comme séparateur de liste
    'vbalist = GU & "test1" & GU & Sep & GU & "test2" & GU & Sep & GU & "Test3" & GU ' prepare la liste
    DL = Cells(Rows.Count, 2).End(xlUp).Row
    vbalist = """" & Join(Application.Transpose(Application.Index(Range("B1:B" & DL).Value, 0, 1)), """, """) & """"
     
     
    ' construit le script AS
    myAS = "set ASList to " & "{" & vbalist & "}" ' la varialbe ASList est une liste dans Applescript
    myAS = myAS & CR & "set text item delimiters to " & GU & "," & GU
    'myAS = myAS & CR & "return ASList as text" ' renvoie de AS vers VBA de la liste
    myAS = myAS & CR & "set the clipboard to ASList as Unicode text"
    MyPaths = MacScript(myAS) ' retour dans VBA dans la variable ListeRetour
    PP.GetFromClipboard: MyPaths = PP.GetText(): Recup = Split(MyPaths, ",")
    Cells(1, 4).Resize(UBound(Recup)) = Application.Transpose(Recup)
    End Sub
    d'ailleurs je viens de retester vite fait sans passer par le presse papier en direct => ça marche nickel
    Code vba : 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
    Sub Macro2() ' test envoie d'une liste à Applescript
    Dim myAS As String, MyPaths As String, PP As New MSForms.DataObject
    CR = Chr$(13)
    GU = Chr$(34)
    Sep = "," ' virgule comme séparateur de liste
    'vbalist = GU & "test1" & GU & Sep & GU & "test2" & GU & Sep & GU & "Test3" & GU ' prepare la liste
    DL = Cells(Rows.Count, 2).End(xlUp).Row
    vbalist = """" & Join(Application.Transpose(Application.Index(Range("B1:B" & DL).Value, 0, 1)), """, """) & """"
     
     
    ' construit le script AS
    myAS = "set ASList to " & "{" & vbalist & "}" ' la varialbe ASList est une liste dans Applescript
    myAS = myAS & CR & "set text item delimiters to " & GU & "," & GU
    myAS = myAS & CR & "return ASList as text" ' renvoie de AS vers VBA de la liste
    'myAS = myAS & CR & "set the clipboard to ASList as Unicode text"
    MyPaths = MacScript(myAS) ' retour dans VBA dans la variable ListeRetour
    'PP.GetFromClipboard: MyPaths = PP.GetText(): Recup = Split(MyPaths, ",")
    Recup = Split(MyPaths, ",")
    Cells(1, 4).Resize(UBound(Recup)) = Application.Transpose(Recup)
    End Sub
    il manque plus que le traitement à faire

    Évidement je testerai aussi "La première méthode est sans doute la plus pertinente" du post #8, mais chaque chose en son temps

    Edit 2 : j'ai une piste je pense pour le do shell script :
    apparement en AppleScript si on veut écrire des guillemets sous forme de texte pour un mot il faut alors utiliser le BackSlash comme ceci \"LeTexte\"
    mais dans le cas de VBA faut il doubler ces guillemets comme ceci : \""LeTexte\""
    je continue de tester
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  12. #12
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir PBELL,

    Concernant le BackSlash c'était bien cela, j'ai tout repris en suivant tes conseils en traitant chaque parties indépendamment afin de vérifier chaque String de l'AS en VBA,
    pour ensuite rassembler le tout en rajoutant :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    MonScript = MonScript & Chr(13) & "… …"

    j'ai fait un test pour 896 lignes j'ai eu les Extentions ou le type de l'extension (??) en 6,5 s environ (ils ont été tous retournés) - voilà le code :
    Code vba : 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
    Sub Test6()
     
        DL = Cells(Rows.Count, 2).End(xlUp).Row
        Plage = Range("B1:B" & DL).Value
        vbalist = """" & Join(Application.Transpose(Application.Index(Plage, 0, 1)), """, """) & """"
        Dossier = "/Users/KAB/Desktop/Photos Ugo/"
     
        'vbalist = """1"", ""2"", ""3"""
     
                    MonScript = "set pFolder to " & Chr(34) & Dossier & Chr(34)
                    MonScript = MonScript & Chr(13) & "set myList to " & "{" & vbalist & "}" & Chr(13) & "set TheNewlist to {}"
                    MonScript = MonScript & Chr(13) & "repeat with theItem in myList"
                    MonScript = MonScript & Chr(13) & "set Chm to (POSIX file (do shell script ""find "" & quoted form of pFolder & "" -name "" & theItem & ""\"".*\"""")) as alias"
                    MonScript = MonScript & Chr(13) & "tell application ""Finder"" to set Ext to name extension of Chm" & Chr(13) & "set end of TheNewlist to Ext"
                    MonScript = MonScript & Chr(13) & "end repeat"
                    MonScript = MonScript & Chr(13) & "return TheNewlist"
                    T = Timer
                    MesExt = MacScript(MonScript)
                    MsgBox "Traitement AS sur " & UBound(Plage) & " ligne(s) en : " & Format(Timer - T, "0.000 s")
                    Debug.Print MesExt
    End Sub

    Qu'en penses tu ? le temps te parait raisonnables ? As tu des idées pour améliorer/optimiser le code afin de pouvoir aller plus vite ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  13. #13
    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 Ryu,

    Ton script récupère le résultat de la commande shell 'find', mais visiblement tu ne traites pas le cas ou le find ne trouve rien.
    Dans ce cas, ta variable Chm provoquera une erreur dans le Finder lors de la recherche de l'extension.

    Si tu es certain que ta liste Excel référence toujours des fichiers existants, pas de souci. Mais je crois avoir compris sur les échanges précédents que tu voulais aussi le statut trouvé ou pas.

    Quant au temps de 6,5s il est difficile de savoir où optimiser. C'est un mélange de beaucoup de variables:
    - ta machine
    - le processus de transfer des listes de VBA à AS et vice versa.
    - le volume des fichiers parmi lesquels rechercher
    La méthode find est sans doute la plus rapide que tu peux trouver.
    Je me demande cependant si on ne peut pas éviter la commande Finder car les scripts Finder sont réputés lents.

    En effet, ton script se limite maintenant à l'extraction de l'extension (sans le chemin, ni le nom complet, ni le status existe). Dans ce cas, il est sûrement possible de combiner, dans la même ligne 'do shell script' le find avec une commande awk permettant d'extraire l'extension directement.
    Tu pourras ainsi supprimer la commande 'tell "Finder" ...' qui prends du temps.
    Dans ce cas, je pense que le gain de vitesse devrait être important.

    Je ne suis pas spécialiste shell, mais si tes chemins et noms de fichier ne contiennent pas de '.' (hormis l'extension), alors la commande suivante te renvoie l'extension directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /Users/Moi/Chemin/ -name xxxx.* | awk -F . '{print $2}'
    Quelques explications:
    Je suppose ici, comme tu l'as fait dans ton script, que le fichier sera toujours trouvé par le 'find'.
    Le '|' permet l'enchainement de 2 commandes shell : le 'find' va envoyer son résultat à la commande 'awk'.
    La commande awk, dans cette forme, défini le '.' (après le '-F') comme un séparateur de string. Donc si le résultat du find est '/chemin/fichier.ext', alors le 'awk' donnera 2 variables: '/chemin/fichier' qui se situe avant le '.' et 'ext' qui se situe après.
    Enfin le '{print $2}' retourne la seconde variable, qui est justement l'extension que tu cherches !

    Si tu es certain que tes chemins et noms n'ont pas de '.' et que le fichier existe toujours alors cela fonctionne. Tu peux essayer sur tes 896 lignes (on sait que les fichiers existent !)

    Mais si tes chemins et noms de fichier contiennent d'autres '.', il faudra passer par des commandes shell plus complexes que tu peux demander sur ce forum (en shell programmation). Il y a d'excellents experts. (je ne me sens pas de niveau en shell, même si je progresse !)

    Cordialement

  14. #14
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour PBELL,

    Merci de ce retour et de toutes ces explications.
    En effet, je n'ai pas encore tout traité (la gestion d'erreur, …).
    À chaque fois que je traite de AS dans une discussion, tout est nouveau et me prends pas mal de temps entre les recherches, les tests, les infos/codes que tu me fournis (sans compter mon 2e taf, celui de parent).
    Et comme c'est du travail perso, je ne peux l'effectuer que le soir.

    Donc, si tout n'est pas encore mis dans mon code c'est normal car il faut que je puisse bien comprendre ce que je fait afin de pouvoir avancer sur les étapes suivantes. Mon apprentissage se faisant en même temps, je n'ai pas forcément tous les tenants et aboutissants afin de procéder de la meilleure manière ; mais ca avance .

    C'est une très bonne idée de supprimer la commande avec tell Finder (je savais pas qu'elle était lente). Je vais aller vers cette voie avec ta proposition contenant "awk".

    Ton script récupère le résultat de la commande shell 'find', mais visiblement tu ne traites pas le cas ou le find ne trouve rien. Dans ce cas, ta variable Chm provoquera une erreur dans le Finder lors de la recherche de l'extension.
    Non, je n'ai pas abandonné la gestion d'erreur. Peux-tu me donner stp, un exemple simple en pure As et un exemple simple avec mélange AS et une simple commande Shell, afin d'en comprendre le mécanisme.
    Et non je ne suis pas certain que la liste Excel référence toujours des fichiers existants.

    PS :
    J'avais commencé à t'écrire un script AS acceptant comme variable un chemin/nom de fichier (le fichier contenant en ligne 1 le dossier des recherches et les lignes suivantes les noms). Ce script renvoie le même fichier text au format text tab delimiter avec, sur chaque ligne : le nom initial, le nom du fichier si trouvé, le nom de son extension et un statut "existe /introuvable". Je mets cela de côté.
    Tu as égayé ma curiosité …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  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,
    Tu as raison, le meilleur moyen d'apprendre et d'essayer.

    "L' expérience est le nom que chacun donne à ses erreurs" comme disait Oscar Wilde.

    Voici donc 2 exemples de scripts qui, à partir du dossier de recherche et d'une liste VBAList de noms, vont retourner, par fichier, une ligne avec 4 colonnes séparées par des tabulations (prêt pour Excel !), le tout dans la variable "ligne".
    Tu devras remplacé le 'log', que j'ai mis sur cette variable pour tester, par une récupération dans une liste vers VBA.

    Dans la variable ligne :
    La première colonne est le nom initial fourni par la liste VBAList.
    La seconde est le nom complet du fichier (nom.ext) si le fichier existe ou vide si le fichier n'est pas trouvé.
    La 3ième est l'extension si le fichier existe ou vide si le fichier n'est pas trouvé.
    Enfin la quatrième est un statut avec "Fichier OK" ou "Introuvable". On pourrait se passer de cette colonne et se contenter de tester la seconde ou 3ième si elles sont vides !!

    Dans les 2 scripts, j'ai assigné directement la variable VBAList et la variable MonDossier avec des valeurs pour mes tests.
    Pour toi, VBA sera défini par ta liste en provenance de VBA.

    Le premier script fait appel au Finder:

    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
    set VBAList to {"test1", "test2", "test3"}
    set Mondossier to "ElCapitain:Users:imac27:Desktop:VBA_AS:" as alias
    
    repeat with I from 1 to (count of VBAList) -- boucle sur chaque nom
        set Nom to item I of VBAList
        tell application "Finder"
            set MesFichiers to (every file of Mondossier whose name contains Nom)
            if (count of MesFichiers) is 0 then -- fichier non trouvé
                set ligne to Nom & tab & tab & "Introuvable" -- format = nom, fichier, extension, statut
            else -- fichier trouvé, lit le chemin et l'extension
                set ligne to Nom & tab & (name of item 1 of MesFichiers) & tab & (name extension of item 1 of MesFichiers) & tab & "Fichier OK"
            end if
    --la variable ligne contient le nom de départ, celui du fichier avec extension, l'extension seule et le statut
    log ligne
        end tell
    end repeat
    Le second script fait appel au shell script avec un find suivi d'un awk. j'ai testé le cas où le find ne trouve rien : le awk renvoie aussi une chaine vide ! C'est parfait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set VBAList to {"test1", "test2", "test3"}
    set Mondossier to "/Users/imac27/Desktop/VBA_AS"
    
    repeat with I from 1 to (count of VBAList) -- boucle sur chaque nom
        set Nom to item I of VBAList
        set Ext to do shell script "find " & Mondossier & " -name " & Nom & ".* | awk -F . '{print $2}'"
        if Ext is "" then -- fichier non trouvé
            set ligne to Nom & tab & tab & "Introuvable" & return-- format = nom, fichier, extension, statut
        else -- fichier trouvé, lit le chemin et l'extension
            set ligne to Nom & tab & (Nom & "." & Ext) & tab & Ext & tab & "Fichier OK" & return
        end if
    --la variable ligne contient le nom de départ, celui du fichier avec extension, l'extension seule, et le statut
    log ligne
    end repeat
    Je n'ai pas mesuré d'écart de vitesse sur les 3 fichiers: dans mon test, test1 et test3 existent, mais pas test2).
    L'écart de vitesse doit être mesurable sur 800 fichiers ou plus.

    Je souligne que dans le cas du Finder, MonDossier doit être un alias formaté en "Finder" (séparateurs : ) alors que dans le cas du shell, j'ai directement assigné MonDossier au format shell (séparateurs / ).

    Cordialement

  16. #16
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir PBELL ,

    j'ai fait qq recherches pour voir si il y avait d'autres pistes comme par exemple tout traiter directement dans le terminal c-à-d :
    en passant VBAList de AS au terminal et faire le traitement dans le terminal via une boucle dont on récupère le résultat dans AS;
    mais pour l'instant chou blanc la dessus.

    Concernant les codes que tu m'as fournis

    j'ai pu parfaire le déboguage grâce à tes conseils et un simple Debug.Print qui permet de copier le résultat de la fenêtre d'exécution vba Excel en AS
    afin de le remettre dans l'éditeur de Script et voir si le code marche ou pas => très pratique !

    Le gain de temps à pu se faire surtout au redémarrage d'Excel mais je me retrouve avec des temps non statique (aléatoire);
    le mieux c'est environ 4,5 s et le moins bons environs 7 s pour 896 fichiers traités

    les codes :

    Code vba : 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
    Sub Test7()
     
        DL = Cells(Rows.Count, 2).End(xlUp).Row
        Plage = Range("B1:B" & DL).Value
        vbalist = """" & Join(Application.Transpose(Application.Index(Plage, 0, 1)), """, """) & """"
        Dossier = "/Users/KAB/Desktop/Photos Ugo/"
        'Dossier = "/Users/KAB/Desktop/DeveloppezCom/Renommage/Images/"
     
        'vbalist = """1"", ""2"", ""3"""
                    'set Ext to do shell script "find " & Mondossier & " -name " & Nom & ".* | awk -F . '{print $2}'"
                    'titi = "set Chm to (do shell script ""find "" & quoted form of pFolder & "" -name "" & theItem & "".* | awk -F . '{print $2}'"") as text"
                    MonScript = "set pFolder to " & Chr(34) & Dossier & Chr(34)
                    MonScript = MonScript & Chr(13) & "set myList to " & "{" & vbalist & "}" & Chr(13) & "set TheNewlist to {}"
                    MonScript = MonScript & Chr(13) & "repeat with theItem in myList"
                    MonScript = MonScript & Chr(13) & "set Chm to (do shell script ""find "" & quoted form of pFolder & "" -name "" & theItem & "".* | awk -F . '{print $2}'"") as text"
                    MonScript = MonScript & Chr(13) & "set end of TheNewlist to Chm"
                    MonScript = MonScript & Chr(13) & "end repeat"
                    MonScript = MonScript & Chr(13) & "return TheNewlist"
                    T = Timer
                    MesExt = MacScript(MonScript)
                    MsgBox "Traitement AS sur " & UBound(Plage) & " ligne(s) en : " & Format(Timer - T, "0.000 s")
                    Debug.Print MesExt: MesExt = Split(MesExt, ", ")
                    Range("C1").Resize(UBound(MesExt) + 1) = Application.Transpose(MesExt)
    End Sub


    Pour ce code les Tab ne marchent pas dans le résultat Excel le mot tab apparait - je n'ai pas trouvé comment y remédier :
    Code vba : 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
    Sub test8()
     
        DL = Cells(Rows.Count, 2).End(xlUp).Row
        Plage = Range("B1:B" & DL).Value
        MaList = """" & Join(Application.Transpose(Application.Index(Plage, 0, 1)), """, """) & """"
        Dossier = "/Users/KAB/Desktop/Photos Ugo/"
     
            MonScript = "set VBAList to {" & MaList & "}"
            MonScript = MonScript & Chr(13) & "set Mondossier to " & Chr(34) & Dossier & Chr(34)
            MonScript = MonScript & Chr(13) & "set L to {}"
            MonScript = MonScript & Chr(13) & "repeat with I from 1 to (count of VBAList)"
            MonScript = MonScript & Chr(13) & "set Nom to item I of VBAList"
            MonScript = MonScript & Chr(13) & "set Ext to do shell script ""find "" & quoted form of Mondossier & "" -name "" & Nom & "".* | awk -F . '{print $2}'"""
            MonScript = MonScript & Chr(13) & "if Ext is """" then"
            MonScript = MonScript & Chr(13) & "set ligne to Nom & tab & tab & ""Introuvable"" & return"
            MonScript = MonScript & Chr(13) & "else"
            MonScript = MonScript & Chr(13) & "set ligne to Nom & tab & (Nom & ""."" & Ext) & tab & Ext & tab & ""Fichier OK"" & return"
            MonScript = MonScript & Chr(13) & "End If"
            MonScript = MonScript & Chr(13) & "set end of L to ligne"
            MonScript = MonScript & Chr(13) & "end repeat"
            MonScript = MonScript & Chr(13) & "return L as text"
            Debug.Print MonScript
            T = Timer
            RESULT = MacScript(MonScript)
            MsgBox "Traitement AS sur " & UBound(Plage) & " ligne(s) en : " & Format(Timer - T, "0.000 s")
            RESULT = Split(RESULT, vbNewLine)
            Range("D1").Resize(UBound(RESULT) + 1) = Application.Transpose(RESULT)
     
    End Sub

    Le même en AS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set VBAList to {"SDC10997", "SDC10998", "SDC10999"}
    set Mondossier to "/Users/KAB/Desktop/Photos Ugo/"
    set L to {}
    repeat with I from 1 to (count of VBAList)
    	set Nom to item I of VBAList
    	set Ext to do shell script "find " & quoted form of Mondossier & " -name " & Nom & ".* | awk -F . '{print $2}'"
    	if Ext is "" then
    		set ligne to Nom & tab & tab & "Introuvable" & return
    	else
    		set ligne to Nom & tab & (Nom & "." & Ext) & tab & Ext & tab & "Fichier OK" & return
    	end if
    	set end of L to ligne
    end repeat
    return L as text
    Edit : n'ayant pas su comment gérer log en AS j'ai remis le résultat dans une liste,
    j'ai essayer de trouver un moyen de récupérer le résultat du log (il me semble que c'est dans "messages"), mais pas moyen
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  17. #17
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour PBELL,

    je n'ai toujours pas résolu ce problème de tabulation dans Excel via AS;
    je vais donner un exemple concret du résultat :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    S = "set AppleScript's text item delimiters to return"
    S = S & Chr(13) & "set L to {""toto"" & tab & ""titi"" & tab & ""tutu"", ""tata"" & tab & ""Ca marche pas""} as unicode text"
    Range("A1") = MacScript(S)
    End Sub

    D'où cela peut venir ?? (par contre dans AS cela marche sans problème)

    Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  18. #18
    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,
    Sauf erreur de ma part, ton script d'exemple assigne la variable S en VBA.
    Je ne suis pas sûr que VBA connaisse la valeur de tab (ascii 09). En tout cas pas de façon visible dans ton script.
    Or VBA, si une variable n'est pas initialisée, elle prend la valeur 0 ou "" selon son type. Je pense donc que ton script assigne en remplaçant les "tab" par rien.

    Arrivé dans AS, on a L={"toto" "titi" ...} ce qui ne donne rien !
    Une liste dans AS doit être de la forme { "toto", "toi",...}

    Donc ton VBA devrait être S= S & car(13) & "set L to {""toto"" & "," & ""titi"" & "," & ...}

    Dans un de mes scripts, j'avais séparé les colonnes de réponse avec des tab pour lire un fichier text / tab delimiters directement dans Excel.
    Mais ce n'est pas nécessaire de passer via les tab si tu ne passe pas par un fichier texte.

    Cordialement

  19. #19
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir PBELL,

    Autant pour moi, je pensais qu'avec ton code où tu avais écris les tab, que l'on pouvait directement utiliser le résultat sans passer par un fichier texte

    Concernant log, peux tu me donner plus d'explication à son utilisation et comment on voit le/les résultat(s) stp ??

    Sinon j'ai tenté de créer le fameux fichier texte (ça marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set AppleScript's text item delimiters to return
    set L to {"toto" & tab & "titi" & tab & "tutu", "tata" & tab & "Ca marche pas"} as Unicode text
    set C to "Macintosh HD:Users:KAB:Desktop:DeveloppezCom:Renommage:Images:" as alias
    set MyFile to open for access ((C as text) & "Newtext.txt") with write permission
    write L to MyFile
    close access MyFile
    Peux tu me donner des conseils/ou exemples sur ce qui faut faire ou pas faire, les bonnes méthodes à utiliser, si il faut utiliser une gestion d'erreur … … ??

    Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  20. #20
    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,

    L'instruction 'log' doit simplement être suivie par ce que tu souhaites afficher.
    Lorsque j'ai beaucoup de 'log' dans un script, je mets dans l'affichage quelque chose qui m'indique quel log. C'est utile surtout si tu as des doutes sur le résultat de tests en 'if'.

    Voici quelques exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    repeat with I from 1 to 5
        log "I=" & I
    end repeat
    
    set M to (text returned of (display dialog "Entrer une valeur" default answer "3")) as integer
    if M > 0 then
        log "M est un nombre positif"
    else
        log "M n'est pas un nombre positif : " & M
    end if
    Dans la partie réponse de l'éditeur de script, après exécution, tu auras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (*I=1*)
    (*I=2*)
    (*I=3*)
    (*I=4*)
    (*I=5*)
    tell application "Script Editor"
    display dialog "Entrer une valeur" default answer "3"
    --> {button returned:"OK", text returned:"6"}
    end tell
    (*M est un nombre positif*)
    Enfin, en ce qui concerne la gestion des erreurs, la règle de base d'un (bon !) programmeur doit être de gérer proprement TOUTES les erreurs possibles. C'est souvent ce qui alourdi le code, mais pour l'expérience utilisateur, cela change tout.
    En Applescript, la gestion des erreurs se fait par des blocs try / on error / end try.
    Les instructions entre le 'try' et le on 'error' sont exécutées. Si l'une d'entre elle est en erreur, le script saute à l'instruction suivant le 'on error'. Là il faut gérer l'erreur. Parfois l'erreur peut être ignorée, parfois non.

    Tu dois imaginer toutes les erreurs possibles: par exemple tu écris un fichier sur un volume bloqué en écriture. Le dossier n'existe pas, le fichier est vide,...etc.
    Par contre, tu peux écrire ton script pour limiter les erreurs possibles.
    Par exemple si tu utilises un "choose file" pour demander à l'utilisateur de sélectionner un fichier, tu peux raisonablement supposer qu'il existe !
    (ce n'est d'ailleurs pas 100% vrai, car il peut être supprimé entre la sélection et l'utilisation dans ton script)

    Pour aller plus loin, regarde sur le site Apple développer "error handler" qui peut te faire penser au "on error /resume" de VBA par certains aspects.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. COnnaitre l'extension d'un fichier.
    Par deubelte dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2012, 09h55
  2. connaitre le type d'un fichier sans extension
    Par Atasuke dans le forum C
    Réponses: 5
    Dernier message: 07/11/2011, 16h56
  3. Connaitre l'extension d'un fichier
    Par nawal.02 dans le forum Débuter
    Réponses: 6
    Dernier message: 11/08/2010, 19h54
  4. Connaitre le type d'un fichier sans son extension
    Par ionone dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 15/07/2009, 14h19
  5. Connaitre l'extension d'un fichier...
    Par nizarsm dans le forum ASP
    Réponses: 10
    Dernier message: 24/04/2006, 09h53

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