Skript som körs av annat skript glömmer properties

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2011-11-29 17:11

Jag har skriptet A som kör skriptet B. I B sätts ett värde i en property. Detta värde är borta nästa gång skriptet körs från A. Varför? Hur får jag B att minnas den data det tar emot?

Hmm... Det här kräver lite djupare förståelse av hur AppleScript fungerar:

AppleScript använder sig av "Script objects", vilket antingen är ett explicit deklarerat script, t.ex.

script myScript
	property x : "Default"
	on run {x}
		display dialog x
	end run
	
end script

eller implicit, vilket sker varje gång du skriver en applescript-fil (det scriptet kan då refereras till genom nyckelorden me/my)

När man vill köra ett script görs det genom att man säger "run script" och då antingen anger namnet på ett script object i den aktuella filen, eller genom att ange en sökväg till en scriptfil som innehåller ett implicit objekt.

När man gör på det senare sättet är det som egentligen händer att man skapar en tillfällig kopia i minnet av det script som ligger i filen och den tillfälliga kopian körs sedan.

I nästa steg sparas det script som har körts, men det enda script som då kan sparas är det anropande.

Lite mindre teoretiskt så kan du uppnå det du vill (att spara värden) på två (minst) sätt, antingen genom att inkludera scriptet i den anropande filen, såhär:

display dialog (x of myScript) --detta hämtar värdet från scriptet

run script myScript

set x of myScript to "nytt värde"

script myScript
	property x : "Default"
	log x
end script

Observera att detta script vid första körningen innehåller det ursprungliga värdet ("Default") men vid nästa körning, det därefter lagrade värdet.

Vill du uppnå samma sak med en extern fil måste du jobba med kommando "load script" respektive "store script", dvs du läser in en tillfällig kopia, sätter värdet i det, och skriver sedan helt enkelt över ursprungsfilen med din förändrade kopia.

  • Medlem
  • 2011-11-29 22:46

Hm, jag får förstås inte till det...

set myScript to load script alias myScriptFile
run script myScript

... fungerar.
Men sedan kör jag fast:
-- set x of myScript to "nytt värde"
store script alias myScriptFile
[/code]

Jag kanske ska förklara vad jag håller på med.
Jag har problem med att InDesign inte kan läsa in kortkommandon om skriptfilers innehåll ändras. Därför har jag placerat ett dummyskript (A) i skriptpanelen vilket identifierar sitt eget namn och sedan kör ett annat skript (B) på en annan plats men som har samma namn. Eftersom inget kortkommando pekar på B kan jag ändra i B bäst jag vill utan att kortkommandona påverkas.
Skriptet A är formulerat så att det fungerar med vilket annat skript som helst så länge namnet är identiskt, ändelsen kan tillåts vara .scpt, .scptd eller .app.

set myScriptPath to path to me as Unicode text
tell me to set text item delimiters to ":"
set myNewScriptPath to text items 1 thru -3 of myScriptPath as Unicode text
tell me to set text item delimiters to ""
if (myScriptPath) contains "Adobe InDesign" then
	try
		tell application "Adobe InDesign CS5" to set myScriptPath to active script as Unicode text
	end try
end if
tell me to set text item delimiters to ":"
set myScriptName to text item -1 of myScriptPath
tell me to set text item delimiters to "."
set myName to text item 1 of myScriptName
tell me to set text item delimiters to ""
try
	run script alias (myNewScriptPath & ":Script files:" & myName & ".scpt")
on error
	try
		run script alias (myNewScriptPath & ":Script files:" & myName & ".scptd")
	on error
		try
			run script alias (myNewScriptPath & ":Script files:" & myName & ".app")
		on error
			display alert "blablabla"
		end try
	end try
end try

Skriptet B är ett helt vanligt script, script bundle eller applescript-app som ibland sparar variabler (om det hade fungerat).
Jag har en kopia av B för varje skript jag vill kunna köra och vill inte anpassa kopiorna efter vilket skript det ska köra.
Går detta att göra?

  • Medlem
  • 2011-11-29 22:21

Jag anade att det var nåt sånt när A returnerade fel från B.

Om jag har fattat rätt kan jag göra ungefär så här:

set myScriptFile to "path:to:my:script.scpt"
load script myScriptFile
run script myScript
set x of myScript to "nytt värde"
store script myScriptFile

Anledningen till att du inte får "store script" att fungera är att du inte läst ordlistan och därför inte följer den förväntade syntaxten

store script
store script (verb)Store a script object into a file (from the Scripting Commands suite, defined in StandardAdditions.osax)
 command syntax
store script script ¬
     in file ¬
     replacing savo

Dvs, du hoppar över "in file". Jag misstänker att det är pga av att du (felaktigt) antar att det du har sparat i din variabel "myScriptFile" är en referens till filen, men det är det inte, utan det är resultatet av att applicera kommandot "load script" på den filen, vilket ger ett Script object. Ngt i den den här stilen ska det vara:

set myScript to load script alias myScriptPath
run myScript
store myScript in file myScriptPath

Resten av dina frågor var för otydligt och snårigt formulerade för att jag ska orka dechiffrera dem

  • Medlem
  • 2011-11-30 07:54

Jag testade faktiskt med det och med "alias", men fastnade på det sista myScript i ditt exempel: "Expected end of line, etc. but found identifier."

jamen vafasen, du tror väl inte att jag har testat koden?

Såhär ska det vara:

set myScriptPath to "Macintosh HD:Users:richardr:Desktop:b.scpt"

set myScript to load script alias myScriptPath
run script myScript
store script myScript in file myScriptPath
  • Medlem
  • 2011-11-30 11:13

Det där ger samma resultat, dvs den sparar inga variabler.

du måste självklart ändra värdet innan du sparar scriptet på nytt (som jag skrev)

  • Medlem
  • 2011-11-30 14:11

Jag vill inte behöva anpassa skript A på något sätt till vad skript B eventuellt vill spara för värden. Då faller hela idén.

1
Bevaka tråden