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



## two (29 Août 2007)

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&#233; une recherche google et sur ce site) je cale sur deux points avec ce script : 

```
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&#233;e; elle ne donne aucune action dans l'historique des &#233;v&#232;nements (tout le reste fonctionne y compris la boucle) et me fichiers ne sont naturellement pas copi&#233;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&#233;but de script pour d&#233;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

```
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&#233;rifier ce bout de script et malheureusement tout ce que j'obtient c'est un nous sommes le --
voici ce que l'historique des &#233;v&#232;nemnts m'affiche :

```
tell current application
    current date
        date "mercredi 29 ao&#251;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 &#224; me donner... ?


----------



## ceslinstinct (29 Août 2007)

Bonjour

Si c'est la date de ce jour pour créer le dossier alors:

```
set dossierDate to (do shell script "date +\"%Y-%m-%d\"") as string
display dialog dossierDate
```

Le Y majuscule = 2007 et le y minuscule 07

@+


----------



## two (29 Août 2007)

merci ceslinstinct ca fonctionne &#224; merveille

Un probl&#232;me sur deux de r&#233;solu


----------



## zacromatafalgar (29 Août 2007)

Salut,

Tu devrais utiliser des chemins de la forme "NIKON D80CIM:100NCD:" plut&#244;t que : folder "100NCD80" of folder "DCIM" of disk "NIKON D80".


```
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 &#224; propos du code n'h&#233;site pas&#8230;


----------



## two (29 Août 2007)

en fonction de ton intervention et de celle de ceslinstinct j'ai corrig&#233; mon script pour en faire ceci

```
tell application "Finder"
    set mon_texte to (do shell script "date +\"&#37;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 : 


```
Impossible de transformer &#171;class cfol&#187; "100NCD80" of &#171;class cfol&#187; "DCIM" of &#171;class cdis&#187; "NIKON D80" of
 application "Finder" en type list, record or text.
```
comme je ne comprends pas moi- m&#234;me les trois lignes de "set..." englobant ce qui est surlign&#233; je me tourne &#224; nouveau vers toi


----------



## zacromatafalgar (29 Août 2007)

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&#233;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 &#224; faire &#224; un dossier, on rajoutera "as alias" &#224; la fin. 
Ce qui donne :

```
set dossier_final2 to (dossier_final & mon_texte & ":") as alias
```

Remets le "list folder" &#224; la place de items sinon chaque &#233;l&#233;ment de liste_des_fichiers correspond &#224; un caract&#232;re du chemin de dossier_source

Et &#231;a devrait fonctionner&#8230;


----------



## two (29 Août 2007)

tu vas probablementy me trouver chiant ... ca ne marche pas 

voila ce qu'il me met en historique... 

```
tell application "Finder"
    do shell script "date +\"&#37;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 (30 Août 2007)

two a dit:


> tu vas probablementy me trouver chiant ... ca ne marche pas
> 
> voila ce qu'il me met en historique...
> 
> ...


L'id&#233;al serait que tu mettes le code en entier, si je me r&#233;f&#232;re au retour de l'historique je pense que tu n'as pas d&#251; remplacer "items" par "list folder" dans la ligne

```
set liste_des_fichiers to items of dossier_source
```
ce qui explique, comme je te l'&#233;crivais dans mon message pr&#233;c&#233;dent, que le script consid&#232;re chaque caract&#232;re du chemin comme un item diff&#233;rent.



two a dit:


> 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
> ...


La premi&#232;re de ces 4 lignes r&#233;cup&#232;re le nom du fichier
La seconde construit le chemin du fichier
La troisi&#232;me r&#233;cup&#232;re les informations du fichier (nom, taille, date de cr&#233;ation, extension&#8230
La quatri&#232;me r&#233;cup&#232;re l'extension &#224; partir des informations r&#233;cup&#233;r&#233;es &#224; la ligne 3

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


----------



## two (30 Août 2007)

OK j'ai trouv&#233; 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 &#224; toi 

edit j'ai &#233;crit ce message avant de me rendre compte qu'entre temps tu me donnais la m&#234;me r&#233;ponse :rose:


J'ai d'ailleurs mis ce script &#224; disposition dans ce fil


----------



## two (3 Septembre 2007)

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 : 

```
set dossier_source to "NIKON D80:DCIM:100NCD:"
```
mais lorsque cette ligne est remplacée par celle ci

```
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?


----------



## Anonyme (3 Septembre 2007)

two a dit:


> hello, un petit souci avec ce script : il fonctionne a merveille quand le dossier ou je r&#233;cup&#232;re habituellement mes photos est accessible. grace &#224; cette ligne :
> 
> ```
> set dossier_source to "NIKON D80:DCIM:100NCD:"
> ...


La commande "choose folder" ne renvoie pas une r&#233;f&#233;rence, mais une liste de r&#233;f&#233;rences.
Essaye :

```
set dossier_source to item 1 of choose folder with prompt "Choisissez l'emplacement des photos &#224; importer."
```


----------



## zacromatafalgar (3 Septembre 2007)

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


```
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 (3 Septembre 2007)

merci, c'est parfait...
Oui j'avais aussi un probl&#232;me avec le dossier final si celui par d&#233;faut &#233;tait absent mais beaucoup moins grave : il cr&#233;ait bien un sous dosier dat&#233; dans le dossier que je choisissais  et me demandait juste apr&#232;s de le choisir &#224; nouveau.
Ce qui ne me faisait qu'une s&#233;lection en plus.
Je vais le modifier pour cela aussi...


----------



## zacromatafalgar (3 Septembre 2007)

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

```
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 (3 Septembre 2007)

je suis arriv&#233; &#224; un &#233;quivalant en remplacant le as alias pr&#233;cedent non pas par as string)as alias mais juste par as string et en mettant un as alias &#224; chaque r&#233;curence suivante de dossier_final2... 

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

 merci


----------

