Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Kodexempel: Kolla om processer lever eller inte

Tråden skapades och har fått 10 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2005-01-22 18:59

Här är lite kod som gör att ett script inte fortsätter så länge en process är igång. I detta exemple 'StuffIt Expander'.

repeat
	tell application "Finder"
		--'(name of processes) as text' ger en sträng med alla processnamn. T.ex.
		--"loginwindowTimbuktu HostDockSystemUIServerFinderLCCDaemonUniversalAccessTimbuktu Host
		--MenuSafariScript EditorSystem EventsStuffIt Expander"
		set process_namn to (name of processes) as text
		-- Testet
		if "StuffIt" is not in process_namn then exit repeat
		delay 2 -- Test varannan sekund
		beep --beep är bra för att "lyssna" hur scriptet beter sig.
	end tell
end repeat
display dialog "exit repeat"
  • Medlem
  • International user
  • 2005-01-22 19:09

Samma sak med 'do shell script':

-- AppleScript-kod
do shell script "#!/bin/sh
while true
do
osascript -e 'tell app \"Finder\" to get processes' | grep StuffIt > /dev/null
if [ $? -eq 1 ]
then
	exit
fi
sleep 2
done
exit 0
"

Inspirerad kompletterar jag med ett script som kollar att ett önskat program är igång med önskat intervall, och om inte startar processen

property TheApp : "Microsoft Entourage"
property TheInterval : 5
property TheBeep : true

CheckAppRun(TheApp, TheInterval, TheBeep)

on CheckAppRun(TheApp, TheInterval)
	tell application TheApp to launch
	tell application "System Events"
		repeat while TheApp is in name of processes
			delay TheInterval
			if TheBeep is true then beep
		end repeat
		my CheckAppRun(TheApp, TheInterval, TheBeep)
	end tell
end CheckAppRun
  • Medlem
  • International user
  • 2005-01-22 20:41

Har optimerat din kod

property TheApp : "Microsoft Entourage"
property TheInterval : 5
property TheBeep : true

CheckAppRun()

on CheckAppRun()
	tell application TheApp to launch
	tell application "System Events"
		repeat while TheApp is in name of processes
			delay TheInterval
			if TheBeep then beep
		end repeat
		my CheckAppRun()
	end tell
end CheckAppRun
Senast redigerat 2005-01-22 21:04

Nja, det skulle jag kanse inte säga, det är exakt samma sak som händer, det är bara olika sätt att skriva det.

Personligen tycker jag dock det där sättet är så kryptiskt så att jag måste tänka efter vad det betyder varje gång

  • Medlem
  • International user
  • 2005-01-22 20:55

Du väl inte glömt...

Jovars, men det var ju en begränsning som i editorn, inte i språket. Begränsningen togs bort i och med Script Editor 2.0.

Själv använder jag dock Script Debugger från Latenight Software - superbra program för applescriptare!

  • Medlem
  • Stockholm
  • 2005-01-23 00:14
Ursprungligen av Richard Rönnbäck:

Jovars, men det var ju en begränsning som i editorn, inte i språket. Begränsningen togs bort i och med Script Editor 2.0.

Själv använder jag dock Script Debugger från Latenight Software - superbra program för applescriptare!

Förlåt en yngling, men vad är det för fördelar med att köra Script Debugger?

Vänligen, Ylan, som för övrigt tackar för skripten!

  • Medlem
  • Stockholm
  • 2005-01-23 00:17

Wire,

Är det någon prestandaskillnad mellan att köra AS eller shell script?

Vänligen, Ylan

Ursprungligen av Ylan:

Wire,

Är det någon prestandaskillnad mellan att köra AS eller shell script?

Vänligen, Ylan

Lite för generell fråga: Shell är snabbare på vissa saker, AS på annat. I de olika exemplen man ser här så är Shell mycket långsammare, därför att "osascript" kompileras i realtid, för varje loop, vilket tar tid, och sedan tar det väldigt mycket tid att för varje loop switcha från shell till OSA> AS> Shell.

Wires AS-exempel ser man istället håller sig enbart inom Finder, och är som alla AS redan kompilerat, därför är det mycket snabbare

Ett grovt, och kanske något missvisande, prestandatest är att först köra ett AppleScript som

repeat 100 times
	get current date
end repeat

vilket är praktiskt taget momentant

Testa sedan att i terminalen köra:

for ((var=1; var <= 100 ; var++)) 
do
   osascript -e 'current date'
done

Vilket som synes är väldigt långsamt. Delvis beror det naturligtvis på att resultatet visas i Terminalen, men i allt väsentligt beror det på att kompilering och processbyte sker vid varje loop, så genom att endast göra en kompilering och endast ett processbyte så kan man uppnå nästan samma resultat via osascript, genom att istället skriva så häri Terminalen:

osascript -e 'repeat 100 times' -e 'get current date' -e 'end repeat'

När det gäller effektvitet så är däremot vare sig Wires eller mitt exempel helt optimalt, eftersom "on idle" hade varit ett bättre val än "delay" , men det är en annan historia...

Ursprungligen av Ylan:

Förlåt en yngling, men vad är det för fördelar med att köra Script Debugger?

Vänligen, Ylan, som för övrigt tackar för skripten!

Så många så att de knapp kan räknas upp, men i korta drag så kan man stega genom skripten, sätta watch points och break points, spåra variabler och deras innehåll, debugga droplets och folder actions, konsolidera script

Och sen tusen småsaker också

det finns det som är sämre också, det har sitt ursprung i OS 9-tiden och kan därför inte spara filer med namn längre än 32 bokstäver, det har bara ett ångrasteg (största begränsningen men alla andra fördelar överväger så solklart) och har inte Manusredigerarens små kontextmenyer (fast det har "clippings" vilket är i princip samma sak)

När man en gång har använt det och skådat ljuset går man aldrig tillbaka

1
Bevaka tråden