Fånigt litet AppleScript

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Jönköping
  • 2007-02-17 09:48

Försöker göra ett script som skalar om en bild och spara i nytt namn. Det ska alltså tex spara bilden "bil.jpg" till "640bil.jpg". Hur gör man? Förövrigt blir jag förvirrad av alla konstiga felmeddelande i manusredigeraren.

Funkar det att nästla tell förresten?

set selectedfile to choose file

tell application "Image Events"

set openedfile to open (selectedfile as alias)
set filelocation to the location of openedfile
set fileName to the name of openedfile

scale openedfile to size 640

save as filelocation & "kalle.jpg"
close openedfile

end tell

tell application "Finder"
set the name of file fileName of filelocation to ("640" & fileName)
end tell

Det är är nog egentligen mycket enklare att göra i Automator än att scripta det själv.

Hur som helst så råkar jag ha ett folderaction script som jag har hittat någonstans, men jag har för mig att jag varit inne och pillat i det själv också, och det ser ut så här.

property done_foldername : "Thumbs"
property originals_foldername : "Original Images"
property newimage_extension : "jpg"
-- the list of file types which will be processed 
-- eg: {"PICT", "JPEG", "TIFF", "GIFf"} 
property type_list : {"TIFF", "GIFf", "PNGf", "PICT", "PICT", "PDF", "JPEG"}
-- since file types are optional in Mac OS X, 
-- check the name extension if there is no file type 
-- NOTE: do not use periods (.) with the items in the name extensions list 
-- eg: {"txt", "text", "jpg", "jpeg"}, NOT: {".txt", ".text", ".jpg", ".jpeg"} 
property extension_list : {"tif", "tiff", "gif", "png", "pict", "pct", "pdf", "jpg", "jpeg"}


on adding folder items to this_folder after receiving these_items
	tell application "Finder"
		if not (exists folder done_foldername of this_folder) then
			make new folder at this_folder with properties {name:done_foldername}
		end if
		set the results_folder to (folder done_foldername of this_folder) as alias
		if not (exists folder originals_foldername of this_folder) then
			make new folder at this_folder with properties {name:originals_foldername}
			set current view of container window of this_folder to list view
		end if
		set the originals_folder to folder originals_foldername of this_folder
	end tell
	try
		repeat with i from 1 to number of items in these_items
			set this_item to item i of these_items
			set the item_info to the info for this_item
			if (alias of the item_info is false and the file type of the item_info is in the type_list) or (the name extension of the item_info is in the extension_list) then
				tell application "Finder"
					my resolve_conflicts(this_item, originals_folder, "")
					set the new_name to my resolve_conflicts(this_item, results_folder, newimage_extension)
					set the source_file to (move this_item to the originals_folder with replacing) as alias
				end tell
				process_item(source_file, new_name, results_folder)
			end if
		end repeat
	on error error_message number error_number
		if the error_number is not -128 then
			tell application "Finder"
				activate
				display dialog error_message buttons {"Cancel"} default button 1 giving up after 120
			end tell
		end if
	end try
end adding folder items to

on resolve_conflicts(this_item, target_folder, new_extension)
	tell application "Finder"
		set the file_name to the name of this_item
		set file_extension to the name extension of this_item
		if the file_extension is "" then
			set the trimmed_name to the file_name
		else
			set the trimmed_name to text 1 thru -((length of file_extension) + 2) of the file_name
		end if
		if the new_extension is "" then
			set target_name to file_name
			set target_extension to file_extension
		else
			set target_extension to new_extension
			set target_name to (the trimmed_name & "." & target_extension) as string
		end if
		if (exists document file target_name of target_folder) then
			set the name_increment to 1
			repeat
				set the new_name to (the trimmed_name & "." & (name_increment as string) & "." & target_extension) as string
				if not (exists document file new_name of the target_folder) then
					-- rename to conflicting file
					set the name of document file target_name of the target_folder to the new_name
					exit repeat
				else
					set the name_increment to the name_increment + 1
				end if
			end repeat
		end if
	end tell
	return the target_name
end resolve_conflicts

-- this sub-routine processes files 
on process_item(source_file, new_name, results_folder)
	-- NOTE that the variable this_item is a file reference in alias format 
	-- FILE PROCESSING STATEMENTS GOES HERE 
	try
		-- the target path is the destination folder and the new file name
		set the target_path to ((results_folder as string) & new_name) as string
		with timeout of 900 seconds
			tell application "Image Events"
				launch -- always use with Folder Actions
				set this_image to open file (source_file as string)
				scale this_image to size 640
				save this_image as JPEG in file target_path with icon
				close this_image
			end tell
		end timeout
	on error error_message
		tell application "Finder"
			activate
			display dialog error_message buttons {"Cancel"} default button 1 giving up after 120
		end tell
	end try
end process_item

Ja, det fungerar att nästla tells, det är så man brukar göra, eftersom man inte kan lägga tell och end tell omlott. Om du har en repeat och en tell tex så kan du inte ha ha ordningen tell, repeat, end tell, end repeat. Det måste vara tell, repeat, end repeat, end tell, eller tvärtom, repeat, tell, end tell, end repeat.

En annan sak att tänka på som är upphovet till många felmeddelanden är att Applescript så att säga byter ordlista innanför ett tell-statement, så om du har ett tell application "Finder" (nånting) så förstår nu Applescript en massa saker om filer, mappar, diskar mm, men när "end tell" kommer så glömmer Applescript bort allt den nyss kunde. Så ett "set name of file bla bla bla" som kommer efter "end tell", kommer att misslyckas för Applescript förstår sig inte på sådana där konstiga kommandon (som den nyss kunde) när de står utanför ett "tell application "Finder".

Det är lite som att jobba med en senil chimpans som man försöker lära att göra saker, men det är bra. Det får en nämligen att dela upp alla problem i mindre och mindre delar, tills man kan lösa delarna. Det är grunden i nästan all programmering och utveckling, det sättet att tänka.

Felaktiga datatyper är nästa felkälla, om du har data i en form, tex en referens till ett filnamn, så är det en egen datatyp så att säga som Finder förstår. Så länge du är innanför ett "tell application "Finder"" så förstås detta. Ett annat program som tex Skriv Text, Photoshop eller Word, vill kanske istället ha namn+sökväg där de skall spara saker i en annan form, tex som text. Alltså måste du före du är utanför tell application Finder göra om filreferensen till en textsträng, som kan användas innanför "tell application Photoshop - save window 1 in filereferece" eller något liknande. Huruvida det är just på pricken så här i olika program får man kolla i deras ordlistor. Så när man får felmeddelanden av det slaget, så får man kolla vilken datatyp man tilldelade en variabel, var någonstans man stod då (innanför vilket tell-statement) och vilken datatyp som kommandot som misslyckas egentligen vill ha.

Om ovanstående inte hjälper att göra felmeddelanden tydliga, så skicka in ditt script och ange felmeddelandet, så kan vi säkert hjälpa till här.

Senast redigerat 2007-02-18 21:15
Ursprungligen av Taz_1999:

Ja, det fungerar att nästla tells... ...så kan vi säkert hjälpa till här.

Mycket bra checklista Taz! Jag tackar!, har gjort en hel del applescript, men den enkla förklaringen du gav var mycket lärorik!

  • Medlem
  • Jönköping
  • 2007-02-18 18:19

Nu funkar det nästan. Men när jag vill spara på rätt ställe blir det problem.

set selectedfile to choose file

tell application "Image Events"

set openedfile to open (selectedfile as alias)
set filelocation to the location of openedfile

set fileName to the name of openedfile

scale openedfile to size 640

funkar inte -> save openedfile in filelocation & "xx640" & fileName
funkar -> save openedfile in "xp640" & fileName

close openedfile

end tell

Kan inte göra om «class cfol» "macdata:Users:nisse:Pictures:" of application "Image Events" till typ list, record or text.

  • Medlem
  • Jönköping
  • 2007-02-18 18:59

nu fick jag till det, men måste man göra det i två steg

set filelocation to the location of openedfile

set the dest_dir to POSIX path of the filelocation

Jepp, just som jag skrev om datatyper så är detta ett vanligt problem med ungefär den lösningen du kom på själv.

1
Bevaka tråden