applesccript : copier des fichiers d'un disque externe à un autre

two

Membre émérite
6 Novembre 2005
895
296
Namur
Bonjour, ne connaissant pas grand chose en applescript je regarde habituellement comment d'autres scripts sont ecrits pour m'en inspirer.
Aujourd'hui (et malgré une recherche google et sur ce site) je cale sur deux points avec ce script :
Bloc de code:
tell application "Finder"
    try
        set dossier_source to folder "100NCD80" of folder "DCIM" of disk "NIKON D80"
    on error
        set dossier_source to choose folder with prompt "Dossier Source "
    end try
    try
        set dossier_final to folder "archive photos raw" of disk "MiniPartner"
    on error
        set dossier_final to choose folder with prompt "Dossier de Destination "
    end try
    make new folder at dossier_final with properties {name:"[COLOR=Blue]mon_texte[/COLOR]"}
    set dossier_final2 to folder "[COLOR=Blue]mon_texte[/COLOR]" of dossier_final
    set liste_des_fichiers to items of dossier_source
    repeat with fichier in liste_des_fichiers as item
        if class of fichier is document file then
            set ext to the name extension of fichier
            if ext = "nef" then
                [COLOR=Red]copy fichier to dossier_final2[/COLOR]
            end if
        end if
    end repeat
end tell
la ligne en rouge semble erronnée; elle ne donne aucune action dans l'historique des évènements (tout le reste fonctionne y compris la boucle) et me fichiers ne sont naturellement pas copiés


pour les deux "mon_texte" je supprimerai les guillemets lorsque j'aurai pu corriger le bout de code suivant (que je mettrai donc en début de script pour définir la variable mon_texte) - en gros je cherche a nommer un nouveau dossier avec la date du jour sous la forme 2007-08-29
Bloc de code:
set currentDate to current date
set an to (log year of currentDate) as text
set mois to (log month of currentDate as integer) as text
set jour to (log day of currentDate) as text
set mon_texte to an & "-" & mois & "-" & jour
tell application "Finder"
    display dialog ("nous sommes le " & mon_texte) buttons {"ok!"} giving up after 10
end tell
le display dialog n'est la que pour vérifier ce bout de script et malheureusement tout ce que j'obtient c'est un nous sommes le --
voici ce que l'historique des évènemnts m'affiche :
Bloc de code:
 tell current application
    current date
        date "mercredi 29 août 2007 11:05:56"
    (*2007*)
    (*8*)
    (*29*)
end tell
tell application "Finder"
    display dialog "nous sommes le --" buttons {"ok!"} giving up after 10
        {button returned:"ok!", gave up:false}
end tell
quelqu'un a t'il une solution ou une piste à me donner... ?
 

ceslinstinct

Membre d’élite
Club MacG
10 Août 2004
2 069
111
21
Bonjour

Si c'est la date de ce jour pour créer le dossier alors:
Bloc de code:
set dossierDate to (do shell script "date +\"%Y-%m-%d\"") as string
display dialog dossierDate

Le Y majuscule = 2007 et le y minuscule 07

@+
 

zacromatafalgar

Membre émérite
Salut,

Tu devrais utiliser des chemins de la forme "NIKON D80:DCIM:100NCD:" plutôt que : folder "100NCD80" of folder "DCIM" of disk "NIKON D80".

Bloc de code:
tell application "Finder"
	try
		set dossier_source to "NIKON D80:DCIM:100NCD:" 
	on error
		set dossier_source to choose folder with prompt "Dossier Source "
	end try
	try
		set dossier_final to "MiniPartner:archives photos raw:" 
	on error
		set dossier_final to choose folder with prompt "Dossier de Destination "
	end try
	if not (exists folder "MiniPartner:archives photos raw:mon_texte:") then
		make new folder at dossier_final with properties {name:"mon_texte"}
	end if
	set dossier_final2 to "MiniPartner:archives photos raw:mon_texte:" 
	set liste_des_fichiers to list folder dossier_source
	
	repeat with fichier in liste_des_fichiers 
		set theFile to contents of fichier
		set pathFile to (dossier_source & theFile)
		set infoFile to info for file pathFile
		set ext to name extension of infoFile
		if ext = "nef" then
			duplicate pathFile to dossier_final2
		end if
	end repeat
end tell

Si tu as des questions à propos du code n'hésite pas… ;)
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
en fonction de ton intervention et de celle de ceslinstinct j'ai corrigé mon script pour en faire ceci
Bloc de code:
tell application "Finder"
    set mon_texte to (do shell script "date +\"%Y-%m-%d\"") as string
    try
        set dossier_source to folder "NIKON D80:DCIM:100NCD80:"
    on error
        set dossier_source to choose folder with prompt "Dossier Source "
    end try
    try
        set dossier_final to folder "MiniPartner:Archive photos raw:"
    on error
        set dossier_final to choose folder with prompt "Dossier de Destination "
    end try
    try
        make new folder at dossier_final with properties {name:mon_texte}
        set dossier_final2 to folder mon_texte of dossier_final
    on error
        set dossier_final2 to choose folder with prompt "Dossier de date "
    end try
    
    set liste_des_fichiers to items of dossier_source
    repeat with fichier in liste_des_fichiers
        set theFile to contents of fichier
        set pathFile to (dossier_source & [COLOR=Blue]theFile)[/COLOR]
        set infoFile to info for file pathFile
        set ext to name extension of infoFile
        if ext = "nef" then
            duplicate pathFile to dossier_final2
        end if
    end repeat
end tell
mais cela ne marche toujour pas : il me surligne le thefile (en bleu ci dessus) en me donnant ceci comme erreur :

Bloc de code:
 Impossible de transformer «class cfol» "100NCD80" of «class cfol» "DCIM" of «class cdis» "NIKON D80" of
 application "Finder" en type list, record or text.
comme je ne comprends pas moi- même les trois lignes de "set..." englobant ce qui est surligné je me tourne à nouveau vers toi
 

zacromatafalgar

Membre émérite
Commence par enlever les "folder" avant dossier_source et dossier_final car on a besoin du chemin complet et pas seulement du nom du dossier.

Lorsque tu crées le dossier il faut construire le nouveau chemin en prenant le chemin de dossier_final et en rajoutant le nom du dossier (mon_texte) sans oublier les 2 points ":" pour indiquer que nous avons à faire à un dossier, on rajoutera "as alias" à la fin.
Ce qui donne :
Bloc de code:
set dossier_final2 to (dossier_final & mon_texte & ":") as alias

Remets le "list folder" à la place de items sinon chaque élément de liste_des_fichiers correspond à un caractère du chemin de dossier_source

Et ça devrait fonctionner… ;)
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
tu vas probablementy me trouver chiant ... ca ne marche pas

voila ce qu'il me met en historique...
Bloc de code:
tell application "Finder"
    do shell script "date +\"%Y-%m-%d\""
        "2007-08-29"
    make new folder at "MiniPartner:Archive photos raw:" with properties {name:"2007-08-29"}
    choose folder with prompt "Dossier de date "
        alias "MiniPartner:Archive photos raw:2007-08-29:"
    info for file "NIKON D80:DCIM:100NCD80:N"
        "Erreur dans Finder : Fichier NIKON D80:DCIM:100NCD80:N introuvable."
en me mettant " info for file pathFile " en surbrillance on a avance d'une ligne

je dois t'avouer que je ne sais absolument pas ce que je lui fais faire sur ces quatre lignes

set theFile to contents of fichier
set pathFile to (dossier_source & theFile)
set infoFile to info for file pathFile
set ext to name extension of infoFile
 

zacromatafalgar

Membre émérite
tu vas probablementy me trouver chiant ... ca ne marche pas

voila ce qu'il me met en historique...
Bloc de code:
tell application "Finder"
    do shell script "date +\"%Y-%m-%d\""
        "2007-08-29"
    make new folder at "MiniPartner:Archive photos raw:" with properties {name:"2007-08-29"}
    choose folder with prompt "Dossier de date "
        alias "MiniPartner:Archive photos raw:2007-08-29:"
    info for file "NIKON D80:DCIM:100NCD80:N"
        "Erreur dans Finder : Fichier NIKON D80:DCIM:100NCD80:N introuvable."
en me mettant " info for file pathFile " en surbrillance on a avance d'une ligne
L'idéal serait que tu mettes le code en entier, si je me réfère au retour de l'historique je pense que tu n'as pas dû remplacer "items" par "list folder" dans la ligne
Bloc de code:
    set liste_des_fichiers to items of dossier_source
ce qui explique, comme je te l'écrivais dans mon message précédent, que le script considère chaque caractère du chemin comme un item différent.

je dois t'avouer que je ne sais absolument pas ce que je lui fais faire sur ces quatre lignes

set theFile to contents of fichier
log theFile
set pathFile to (dossier_source & theFile)
log pathFile
set infoFile to info for file pathFile
set ext to name extension of infoFile
La première de ces 4 lignes récupère le nom du fichier
La seconde construit le chemin du fichier
La troisième récupère les informations du fichier (nom, taille, date de création, extension…)
La quatrième récupère l'extension à partir des informations récupérées à la ligne 3

Pour voir le résultat de chaque ligne il suffit de rajouter l'instruction "log" comme je te l'ai rajouté et tu verras la valeur retournée dans l'historique encadrée par (* ta_valeur *).
;)
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
OK j'ai trouvé mon erreur : la ligne juste avant le repeat : j'avais mis " set liste_des_fichiers to items of dossier_source " alors qu'il faut metre "set liste_des_fichiers to list folder dossier_source "

Un grand merci à toi ;)

edit j'ai écrit ce message avant de me rendre compte qu'entre temps tu me donnais la même réponse :rose:


J'ai d'ailleurs mis ce script à disposition dans ce fil
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
hello, un petit souci avec ce script : il fonctionne a merveille quand le dossier ou je récupère habituellement mes photos est accessible. grace à cette ligne :
Bloc de code:
set dossier_source to "NIKON D80:DCIM:100NCD:"
mais lorsque cette ligne est remplacée par celle ci
Bloc de code:
set dossier_source to choose folder with prompt "Choisissez l'emplacement des photos à importer."
le script me renvoie un message d'erreur : can't set alias "disque:dossier:emplacement de destination" to {alias "disque:dossier:emplacement d'origine",".ds_Store"}

j'ai don la sensation que la commande set to choose folder with prompt n'est pas suffisente pour faire correctement référence à un dossier...
Une idée?
 
A

Anonyme

Invité
hello, un petit souci avec ce script : il fonctionne a merveille quand le dossier ou je récupère habituellement mes photos est accessible. grace à cette ligne :
Bloc de code:
set dossier_source to "NIKON D80:DCIM:100NCD:"
mais lorsque cette ligne est remplacée par celle ci
Bloc de code:
set dossier_source to choose folder with prompt "Choisissez l'emplacement des photos à importer."
le script me renvoie un message d'erreur : can't set alias "disque:dossier:emplacement de destination" to {alias "disque:dossier:emplacement d'origine",".ds_Store"}

j'ai don la sensation que la commande set to choose folder with prompt n'est pas suffisente pour faire correctement référence à un dossier...
Une idée?
La commande "choose folder" ne renvoie pas une référence, mais une liste de références.
Essaye :
Bloc de code:
set dossier_source to item 1 of choose folder with prompt "Choisissez l'emplacement des photos à importer."
 

zacromatafalgar

Membre émérite
J'ai modifié le script et il fonctionne maintenant si le dossier source n'existe pas, il est probable que tu devras modifier dossier_final et dossier_final2 dans le même style mais je te laisse faire…

Bloc de code:
property dossier_source : missing value

tell application "Finder"
	set mon_texte to (do shell script "date +\"%Y-%m-%d\"") as string
	if exists folder "NIKON D80:DCIM:100NCD80:" then
		set dossier_source to "NIKON D80:DCIM:100NCD80:"
	else
		set dossier_source to choose folder with prompt "Dossier Source "
	end if
	try
		set dossier_final to "MiniPartner:Archive photos raw:"
	on error
		set dossier_final to choose folder with prompt "Dossier de Destination "
	end try
	try
		make new folder at dossier_final with properties {name:mon_texte}
		set dossier_final2 to (dossier_final & mon_texte & ":") as alias
	on error
		set dossier_final2 to choose folder with prompt "Dossier de date "
	end try
	
	set liste_des_fichiers to list folder dossier_source
	repeat with fichier in liste_des_fichiers
		set theFile to contents of fichier
		set pathFile to (dossier_source & theFile) as string
		set infoFile to info for file pathFile
		set ext to name extension of infoFile
		if ext = "nef" then
			duplicate (pathFile as alias) to dossier_final2
		end if
	end repeat
end tell
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
merci, c'est parfait...
Oui j'avais aussi un problème avec le dossier final si celui par défaut était absent mais beaucoup moins grave : il créait bien un sous dosier daté dans le dossier que je choisissais et me demandait juste après de le choisir à nouveau.
Ce qui ne me faisait qu'une sélection en plus.
Je vais le modifier pour cela aussi...
 

zacromatafalgar

Membre émérite
Je vais quand même te donner le code car il y a une ligne qui peut peut-être te poser des problèmes dans se dossier_final2, je te laisse les log si tu veux voir le résultat dans l'historique…
Bloc de code:
property dossier_source : missing value
property dossier_final : missing value

tell application "Finder"
	set mon_texte to (do shell script "date +\"%Y-%m-%d\"") as string
	if exists folder "NIKON D80:DCIM:100NCD80:" then
		set dossier_source to "NIKON D80:DCIM:100NCD80:"
	else
		
		set dossier_source to choose folder with prompt "Dossier Source "
	end if
	log "dossier_source : " & dossier_source
	
	if exists folder "MiniPartner:Archive photos raw:" then
		set dossier_final to "MiniPartner:Archive photos raw:"
	else
		set dossier_final to choose folder with prompt "Dossier de Destination "
	end if
	log "dossier_final : " & dossier_final
	
	try
		make new folder at dossier_final with properties {name:mon_texte}
		set dossier_final2 to ((dossier_final & mon_texte & ":") as string) as alias
	on error
		set dossier_final2 to choose folder with prompt "Dossier de date "
	end try
	log "dossier_final2 : " & dossier_final2

	set liste_des_fichiers to list folder dossier_source
	repeat with fichier in liste_des_fichiers
		set theFile to contents of fichier
		set pathFile to (dossier_source & theFile) as string
		set infoFile to info for file pathFile
		set ext to name extension of infoFile
		if ext = "txt" then
			duplicate (pathFile as alias) to dossier_final2
		end if
	end repeat
end tell
 

two

Membre émérite
6 Novembre 2005
895
296
Namur
je suis arrivé à un équivalant en remplacant le as alias précedent non pas par as string)as alias mais juste par as string et en mettant un as alias à chaque récurence suivante de dossier_final2... ;)

ta version est un peu plus propre, je vais donc la reprendre...

:zen: merci :zen: