AppleScript és környéke

A nap tanulsága, hogy az AppleScript do shell script parancsa nem veszi figyelembe a ~/.profile fájl beállításait, tehát minden parancsnál ezt be kell tölteni, ha van benne hasznos beállítás. do shell script "source ~/.profile;..."

2 Likes

Ezért már érdemes volt felkelni. :)

Q. I hear you no longer work for Apple; is that true?
A. Correct. I joined Apple in January of 1997, almost twenty years ago, because of my profound belief that “the power of the computer should reside in the hands of the one using it.” That credo remains my truth to this day. Recently, I was informed that my position as Product Manager of Automation Technologies was eliminated for business reasons. Consequently, I am no longer employed by Apple Inc. But, I still believe my credo to be as true today as ever.

https://macosxautomation.com/about.html

Röviden kirúgták az AppleScriptért felelős embert és a pozíciót is megszűntették.

Gondolom, hamarosan a site domainjet is meg kell változtatnia…

Vagy amiatt rúgták ki.
Mindenesetre remélem, hogy nem fogják hagyni megszüntetni az Apple Scriptet és továbbá is kompatibilis nyelvként meghagyják.
Vagy már annyira jól használható lett az Automator? Mert az is igaz, hogy most már szinte minden Apple Script megoldás helyett Automator-t használok. Bár oda is sokszor bekerül egy-egy Apple Script.

Fura lenne, ha megszűnne az Apple Script. Nem kevés program használja, még ha az nem is mindig látszik.

Az AppleEvents, ami az AppleScript alapját jelenti, alapvetően változtatta meg a Mac OS 7 működését, amikor bekerült. Sok szempontból ez tette azzá a Mac OS-t, ami. A Open Application, Quit, Open Document, Print parancsok kötelezőek voltak, a Finder ezeken keresztül kommunikált a programokkal.

Az Apple megnőtt és még mindig százalékokban számol. Amit megtehetett '97-ben, mert kevés Mac felhasználó volt. De 2016-ban, amikor az 1%-a Mac felhasználóknak 6-7-800 ezer embert jelent, a százalék nem egy jó mérőszám már. Nem egy humánus mérőszám.

Egy komoly komolytalan kérdés: 2.5 asztali operációs rendszer van. Mac OS, Windows, Linux. Az ENSZ védi a világ kulturális örökségét. Vagyon az asztali OS-ek nem veszélyeztetettek és nem kellene-e védelmet élvezniük?

Kíváncsian várom, hogy mi fog történni.

1 Like

Nem is arra gondoltam, hogy egyből megszűnne, hanem csak nem támogatná tovább a saját szoftvereiben. Azaz szép lassan kihalna. Ami szerintem sem egy jó ötlet. Persze ennek csak úgy lenne értelme, ha lenne helyette más, jobb alternatíva.

Hello, talán témába vágó gondom akadt.
Meg lehet oldani applescript vagy automator segítségével a következő folyamatot?

  1. az *.app indítása
  1. finder megnyílik és ki lehet választani a kívánt fájlt/fájlokat
  1. terminal ablak megnyílik és a script folyamata látható
  1. a script lefutása után, időzítetten (mondjuk 20 másodperc múlva) a terminal ablak bezár

A 3. pontig jutottam, méretezve meg tudtam nyitni a terminal ablakot, de a végrhajtással, fájl/fájlok paraméterezésével elakadtam…

Ja, kicsit nehezen esett le, hogy mit akarsz. Szóval az Apple Scriptből akarsz csinálni egy alkalmazást, ami elindít egy fájl kiválasztást és az alapján elindul egy terminal parancs?

:) Igen, applescript vagy automator+applescript segítségével.

Ha eszembe jut róla valami, akkor majd próbálkozom, ezt találtam hirtelen róla: http://stackoverflow.com/questions/1870270/sending-commands-and-strings-to-terminal-app-with-applescript

Amúgy az első gond az az, hogy apple scriptnek várnia kellene addig, míg a terminal be nem záródik egy exit paranccsal. És ha az exit értéke nagyobb, mint 0, akkor kellene csak automatikusan bezárnia, amúgy meg ki kellene írni az exit code-ot. :)

A vége az a legkevésbé fontos, az már csak kozmetika, de a fontos a 3. lépés, azzal vagyok bajban.
Egy fájlal meg tudom oldani, de a több fájl kiválaszthatósága egyelőre legyőzött. :)

A több fájlnak sorban kellene lefutnia vagy párhuzamosan? Vagy mindegy?

Elég, ha sorban lefut.

Idáig jutottam ***, megnyílk a terminal, de az ffmpeg-nek már sehogyan sem tudom megadni a kiválasztott fájl/fájlok útvonalát, valószínűleg nem értem. :)

tell application “Finder” to set theSel to selection

tell application "Terminal"
if not (exists window 1) then reopen
set the bounds of the first window to {0, 0, 800, 600}
set theFol to POSIX path of ((item 1 of theSel) as text)
if (count of windows) is not 0 then
do script “ffmpeg -i” *** in window 1
end if
activate
end tell

Ha jól értem annyi a cél, hogy az ffmpeg minden fájt konvertáljon át. Ehhez nem kell a terminált megnyitni, elég a do shell script parancsot kiadni a scriptben.

Meg kell változtatni az ffmpeg elérési útját valószínűleg nálad és a cél mappát, ahová létrehozza a konvertált fájlokat. A Script Editorban ez egy template, ezzel érdemes játszani. Application formában kell elmenteni és akkor a ráhúzott fájlokat feldolgozza.

(* INSTRUCTIONS
This droplet is designed to process one or more files, or folders containing files, whose icons are dragged onto the droplet icon.
The droplet processes recursively, and will examine the contents of every dragged-on folder, and every sub-folder within those folders, to find and process any files who kind matches the indicated types.
You can set the droplet to process only files of a specific type, such as images, by adding the appropriate data types, name extensions, and type IDs to the values of the properties listed at the top of this script.
Place your script code for processing the found files, within the process_file() sub-routine at the bottom of this script.
*)

(* TO FILTER FOR SPECIFIC FILES, ENTER THE APPROPRIATE DATA IN THE FOLLOWING LISTS: *)
property type_list : {} – e.g.: {“PICT”, “JPEG”, “TIFF”, “GIFf”}
property extension_list : {} – e.g.: {“txt”, “text”, “jpg”, “jpeg”}, NOT: {".txt", “.text”, “.jpg”, “.jpeg”}
property typeIDs_list : {} – e.g.: {“public.jpeg”, “public.tiff”, “public.png”}

(* IMAGE FILTERING )
(

– QuickTime supported image formats
property type_list : {“JPEG”, “TIFF”, “PNGf”, “8BPS”, “BMPf”, “GIFf”, "PDF ", “PICT”}
property extension_list : {“jpg”, “jpeg”, “tif”, “tiff”, “png”, “psd”, “bmp”, “gif”, “jp2”, “pdf”, “pict”, “pct”, “sgi”, “tga”}
property typeIDs_list : {“public.jpeg”, “public.tiff”, “public.png”, “com.adobe.photoshop-image”, “com.microsoft.bmp”, “com.compuserve.gif”, “public.jpeg-2000”, “com.adobe.pdf”, “com.apple.pict”, “com.sgi.sgi-image”, “com.truevision.tga-image”}
*)

(* MOVIE FILTERING )
(

– iDVD supported movie formats
property type_list : {“dvc!”, “MooV”, "M4V ", “mpg4”}
property extension_list : {“mov”, “mp4”, “dv”, “m4v”,“mpg”}
property typeIDs_list : {“public.mpeg-4”, “com.apple.quicktime-movie”}
*)

– This droplet processes files dropped onto the applet
on open these_items
repeat with i from 1 to the count of these_items
set this_item to item i of these_items
set the item_info to info for this_item
if folder of the item_info is true then
process_folder(this_item)
else
try
set this_extension to the name extension of item_info
on error
set this_extension to “”
end try
try
set this_filetype to the file type of item_info
on error
set this_filetype to “”
end try
try
set this_typeID to the type identifier of item_info
on error
set this_typeID to “”
end try
if (folder of the item_info is false) and (package folder of the item_info is false) and (alias of the item_info is false) then
process_file(this_item)
end if
end if
end repeat
end open

– this sub-routine processes folders
on process_folder(this_folder)
set these_items to list folder this_folder without invisibles
repeat with i from 1 to the count of these_items
set this_item to alias ((this_folder as Unicode text) & (item i of these_items))
set the item_info to info for this_item
if folder of the item_info is true then
process_folder(this_item)
else
try
set this_extension to the name extension of item_info
on error
set this_extension to “”
end try
try
set this_filetype to the file type of item_info
on error
set this_filetype to “”
end try
try
set this_typeID to the type identifier of item_info
on error
set this_typeID to “”
end try
if (folder of the item_info is false) and (package folder of the item_info is false) and (alias of the item_info is false) then
process_file(this_item)
end if
end if
end repeat
end process_folder

– this sub-routine processes files
on process_file(this_item)
– NOTE that during execution, the variable this_item contains a file reference in alias format to the item passed into this sub-routine
– FILE PROCESSING STATEMENTS GO HERE
set the item_info to info for this_item
try
set this_extension to the name extension of item_info
on error
set this_extension to “”
end try

set newFileName to "'/Users/Ark/Desktop/" & displayed name of item_info & "_converted." & this_extension & "'"
do shell script "/usr/local/bin/ffmpeg -i " & quoted form of POSIX path of this_item & " " & newFileName

end process_file

1 Like

Köszönöm, ezt a megoldást ismerem, használok dropletet, serviceként is be tudok állítani folyamatokat.
Most a fent leírt formára lenne szükség. Szeretném a folyamatot, terminal ablakban követhető formában futtatni.
Az általam idézett kód megnyitja a terminal ablakot, indítja az ffmpeg-et, de nincs input és output, ezek paraméterézésére nem találtam még számomra érthető leírást. :)

Biztos, hogy jó, ha az activate a végén van? Nem kellene a tell application “Terminal” után írni?
Mert így szerintem nem lesz aktív az alkalmazás. Vagy lehet az is, hogy az új window reopen után kellene. Mert így lehet nem is “oda ír”.

1 Like

Biztos, hogy nem jó. :) Valahogy az inputot és outputot kellene azonosítanom, egyelőre nem megy, de nem adtam fel.

Most kezd nekem realizálódni a probléma legfőbb oka. Méghozzá az, hogy ha átadod a Terminálnak a parancsot, akkor onnantól a Terminal lesz az input és az összes eredmény oda érkezik meg és nem megy vissza a scriptbe.
Bár most néztem meg, hogy nem is kell neked vissza az eredmény, mert csak a terminál ablakban akarod látni.

Szóval itt van nagyjából automatorral:

Itt a kód belőle:

on run {input, parameters}
	tell application "Terminal"
		activate
		tell application "System Events" to keystroke "n" using command down
		repeat with i in input
			set theFile to (i as text)
			set myTab to do script "echo " & quoted form of theFile in window 1
			repeat until myTab is not busy
			end repeat
		end repeat
		delay 3
		tell application "System Events" to keystroke "w" using command down
	end tell
end run

Szóval system events-szerl csinálok új ablakot, majd a végén bezárom. Persze itt majd lehet, hogy neked kellhet, hogy megmondja mekkora legyen, hova rakja, ahogy írtad a scriptben.
Neked még a quoted form of theFile után még kellhet az & " parameters" is, a paraméterek miatt.
Alatta a repeat until részt nem teljesen teszteltem, mert az echo parancs az gyorsan lefutott, szóval az a rész arra hivatott, hogy amíg nem végzett a parancs, addig nem megy tovább a következő parancsra a script.
És van benne egy delay 3, ami 3 másodpercig vár. Majd bezárja a command W-vel a létrehozott (és aktív) ablakot. Ez utóbbival csak az a gond, hogy ha nyitsz közben egy másik terminál tabot vagy ablakot, és az az aktív, akkor azt fogja bezárni :S Szóval lehet a command+n parancs után valahogy le kellene kérdezni az aktív ablakot és azt bezárni a copmmand+w helyett.

Szóval röviden ennyi.

1 Like