Applescript: Stoppa skriptnamnet i variabel?

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2007-12-08 12:31

Jag har en bit kod jag skulle vilja stoppa in sist i flera skript. I denna kod vill jag kunna ta ut namnet på skriptet. Kan jag få fram namnet på skriptet som körs?

Jag hittar bara "path to me", men det ger hela sökvägen inklusive namnet där jag bara vill ha filnamnet.

Text item delimiters är din vän

  • Medlem
  • International user
  • 2007-12-11 20:31

Ett sätt är att använda shellets många möjligheter att förstärka AppleScript.

-- (path to me as text) ger i ett AS-program t.ex. "Macintosh HD:Applications:program.app"
-- Ersätt allt till och med sista kolonet i textsträngen med ingenting
do shell script "echo " & (path to me as text) & " | sed 's/^.*://'"

Observera att om man kör koden direkt i Manusredigeraren får man ett kolon även i slutet av strängen. Vilket man inte får om man spar scriptet som ett program.

  • Medlem
  • 2007-12-11 20:37

Den var fin! Jag fick inte text item delimiters att göra som jag ville med den lilla tid jag hade på mig att felsöka mina klumpiga försök... Tack!

Det finns som vanligt mer än ett sätt att flå en katt.

Min personliga uppfattning är att man bör använda den metod som löser problemet bäst, kräver minst antal "dependencies", ger högst prestanda och tillförlitlighet. Så även om jag håller med Wire om att shell ger fantastiska möjligheter i allmänhet så tycker jag det är ett sämre alternativ i det här fallet, eftersom det är både svårare och långsammare än ett rent applescript, och dessutom knappast ger dig vad du är ute efter.

Grunden för en AppleScript-lösning ser ut så här:

set myPath to "Macintosh HD:Users:richardr:Desktop:kasta3.fp7"
set text item delimiters to ":"
set myFileName to text item -1 of myPath
set text item delimiters to ""
display alert myFileName

Dessvärre är det lite besvärligare än så: "Path to me" ger nämligen normalt sett namnet på den "script host" som kör scriptet, i normala fall programmets namn. Det betyder att "path to me" kommer att vara scriptets namn endast undantagsvis. Att du ser scriptets namn när du kör från Script Debugger är för att den är smartare och försöker hjälpa dig, men du kommer att få ett annat resultat när du kör skarpt...

Den enda gången du egentligen kan räkna med att "Path to me" ger det resultat du (troligen) önskar är om du sparat scriptet som ett program, och till och med då är det besvärligare än man tror, för att...

I OS X kan du spara ett script som program på två sätt, dels som ett program (rosetta) som ger en enda fil, och som en application bundle (universal) som ger ett programpaket, dvs en mapp som visas som en fil.

I och med att sökvägen till en application bundle är samma som till en mapp är sista tecknet i sökvägen ett kolon, vilket innebär att det första exemplets sista "text item" kommer att vara tomt, dvs "" I ett sånt fall måste du istället hämta text item -2, dvs den näst sista

För att verkligen glasera kakan så har InDesign dessutom en egen variant för att lösa problemet på ett tillförlitligt sätt, nämligen något som heter "active script" vilket är en filreferens till det script användaren faktiskt klickar på.

För att lösa problemet på ett tillförlitligt sätt, som kan användas i alla dina script, så borde det bli något i den här stilen:

set myPath to path to me as Unicode text
if (myPath) contains "Adobe InDesign" then
	try
		tell application "Adobe InDesign CS2" to set myPath to active script as Unicode text
	end try
end if

set text item delimiters to ":"
set myFileName to text item -1 of myPath
if myFileName = "" then set myFileName to text item -2 of myPath
set text item delimiters to ""
tell me
	activate
	display alert (myFileName)
end tell


Senast redigerat 2007-12-12 09:36
  • Medlem
  • 2007-12-12 09:52

Åkejrå, ännu bättre.

Som det är just för tillfället har jag hårdkodat in skriptnamnen. Jag får väl ta tag i detta när det finns tid.

Lägg det som en Handler, så här

on doGetScriptName()
	set myPath to path to me as Unicode text
	if (myPath) contains "Adobe InDesign" then
		try
			tell application "Adobe InDesign CS2" to set myPath to active script as Unicode text
		end try
	end if
	
	set text item delimiters to ":"
	set myFileName to text item -1 of myPath
	if myFileName = "" then set myFileName to text item -2 of myPath
	set text item delimiters to ""
	return myFileName
end doGetScriptName
 

Så kan du sedan hämta scriptnamnet genom att skriva:

my doGetScriptName ()
  • Medlem
  • 2007-12-12 16:03

Jag har redan lagt in det "på plats". Vilken är vinsten med handlers om den bara körs en gång per skript?

Funktionellt sett ingen, men det kan ge mer läsbar kod och det blir lättare om du vill återanvända samma funktion i andra script.

Många programmerare strävar också efter ett "blackbox"-tänkande, dvs man anropar ett stycke kod som är som en svart låda, dvs det är helt okänt vad som finns och sker i lådan, men man vet att resultatet alltid är förutsägbart

En handler är ett bra sätt att paketera en sån blackbox, eftersom det är ett stycke "self-contained" kod av väldigt väl avgränsad kod

  • Medlem
  • Mölndal
  • 2007-12-12 18:13

Det ni kallar handler ser ju en som en helt vanlig metod/funktion, och inte alls som det man brukar kalla handlar (t ex en "button click event handler"). Missar jag nåt eller är det bara andra begrepp inom AS?

Det är bara andra begrepp. Handlers är i AppleScript-världen en samlingsbenämning. AppleScript Language Guide definierar det som:

Citat:

Handlers are collection of statements that are executed in response to commands or error messages

Handlers kan delas in i två huvudgrupper:

1

Citat:

Subroutines are collection of statements that AppleScript runs in response to user-defined commands.

2

Citat:

Command handlers are handlers for application commands. They are similar to subroutine handlers, but instead of defining responses to user-defined commands, the define responses to application commands, such as Open, Print or Move, sent to application objects.

Med andra ord, Handlers är bara kod som händer då antingen användaren (scriptet) eller ett visst programobjekt gör något.

I många andra språk skiljer man på subrutiner/funktioner och event handlers, men i AS-världen är handlers alltså ett paraplybegrepp för båda typerna.

  • Medlem
  • Mölndal
  • 2007-12-13 11:53

Jag kan förstå hur de tänkt. De har definierat begreppen på lite mer abstrakt nivå. För en icke-programmerare (ursäkta uttrycket) kan det kanske vara rimligt att jämställa en händelse som kommer från GUIt med ett kommando man själv skrivit i sin scriptfil. Kommentaren ovan om varför man ska dela upp i metoder tyder väl på ett annorlunda synsätt än jag är van vid.

1
Bevaka tråden