2015-12-25 2 views
0

C'est la première fois que j'écris un applescript, et je souhaite accomplir un cas d'utilisation spécifique où plusieurs invocations du même script peuvent accéder et modifier une variable globale spécifique /propriété.Accès à une propriété/variable partagée dans les invocations concurrentes d'un AppleScript

Prenez ce script factice par exemple:

property counter : 0 
set counter to counter + 1 
delay 5 
log counter 

Dites une deuxième instance de ce script est démarré il y a 1 seconde après la première. Je veux qu'il produise 2 quand il se termine, au lieu de 1

Comment puis-je accomplir un tel cas d'utilisation? Serait-il possible d'utiliser une variable d'environnement créée à cet effet?

(Si je peux l'aider ne voudrait pas lire/écrire la valeur à partir d'un fichier)

+0

L'utilisation de "propriété" enregistre la valeur dans votre script (la nouvelle valeur est codée quelque part dans votre script lui-même). Cette valeur de propriété est réinitialisée au moment de la recompilation du script. Donc, si vous ne recompilez pas votre script, votre compteur continuera à augmenter à chaque exécution tant que vous ne le recompilerez pas. Si vous voulez avoir ce compteur valide pour 2 scripts ou plus, vous devez l'enregistrer quelque part dans un fichier séparé (texte, plist, ou tout autre format!) Dans un dossier disponible pour tous vos scripts (bibliothèque utilisateur par exemple). Ensuite, chaque script lira ce fichier. – pbell

Répondre

0

Compte tenu de vos conditions, je vous recommande d'utiliser UserDefaults. Ils sont accessibles par de simples commandes shell:

defaults write [domain] [key] [value] 

defaults read [domain] [key] 

Pour exécuter des scripts shell ceux-ci dans AppleScript, vous utilisez:

do shell script "my_shell_code" 

Voici quelques fonctions pour un compteur que vous pouvez utiliser dans votre script:

on RegisterCounter() 
try 
do shell script "defaults read com.himanshu.my_timer_script counter" 
on error 
do shell script "defaults write com.himanshu.my_timer_script counter 0" 
end try 
end RegisterCounter 

on IncrementCounter() 
my RegisterCounter() 
do shell script ("defaults write com.himanshu.my_timer_script counter " & (quoted form of (((my GetValueOfCounter()) + 1) as text))) 
end IncrementCounter 

on GetValueOfCounter() 
my RegisterCounter() 
return (do shell script "defaults read com.himanshu.my_timer_script counter") as integer 
end GetValueOfCounter 

on ResetCounter() 
try 
do shell script "defaults delete com.himanshu.my_timer_script counter" 
my RegisterCounter() 
end try 
end ResetCounter 

Coller ces fonctions au début ou à la fin de votre script, puis les appeler à l'aide:

my FunctionName() 
+0

Cela semble être la même chose que lire/écrire dans n'importe quel fichier. Droite? Pensez-vous qu'il existe un moyen d'accomplir ceci en lisant/écrivant à une variable (c'est-à-dire en mémoire plutôt qu'un fichier)? –

+0

@Himanshu P Lorsque la variable est enregistrée dans un fichier, la création, la gestion et l'écrasement du fichier sont tous gérés pour vous par le système. Je pense que vous aurez beaucoup de difficultés à essayer de passer des variables à d'autres instances de votre script sans écrire de variables dans un fichier, même temporairement. – Alex