Pfadangabe in AppleScript

Sehr nützlich, da man ohne den Finder auskommt:

tell current application 
    path to "aexƒ" 
    -- alias "FESTPLATTE:Applications:Extras:" 
    path to "apps" 
    -- alias "FESTPLATTE:Users:USERNAME:Applications:" 
    path to "asup" 
    -- alias "FESTPLATTE:Library:Application Support:" 
    path to "flnt" 
    -- alias "FESTPLATTE:private:tmp:501:Cleanup At Startup:" 
    path to "prof" 
    -- alias "FESTPLATTE:System:Library:ColorSync:Profiles:" 
    path to "cmnu" 
    -- alias "FESTPLATTE:Library:Contextual Menu Items:" 
    path to "cusr" 
    -- alias "FESTPLATTE:Users:USERNAME:" 
    path to "desk" 
    -- alias "FESTPLATTE:Users:USERNAME:Desktop:" 
    path to "dtpƒ" 
    -- alias "FESTPLATTE:Library:Desktop Pictures:" 
    path to "docs" 
    -- alias "FESTPLATTE:Users:USERNAME:Documents:" 
    path to "favs" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Favorites:" 
    path to "fnds" 
    -- alias "FESTPLATTE:System:Library:Find:" 
    path to "fasf" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Scripts:Folder Action Scripts:" 
    path to "font" 
    -- alias "FESTPLATTE:System:Library:Fonts:" 
    path to "ƒhlp" 
    -- alias "FESTPLATTE:Library:Documentation:Help:" 
    path to "ilgf" 
    -- alias "FESTPLATTE:Library:Receipts:" 
    path to "issf" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Internet Search Sites:" 
    path to "kchn" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Keychains:" 
    path to "ƒmod" 
    -- alias "FESTPLATTE:System:Library:Modem Scripts:" 
    path to "pref" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Preferences:" 
    path to "ppdf" 
    -- alias "FESTPLATTE:System:Library:Printers:PPDs:" 
    path to "qtex" 
    -- alias "FESTPLATTE:System:Library:QuickTime:" 
    path to "rapp" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Recent Applications:" 
    path to "rdoc" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Recent Documents:" 
    path to "rsvr" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Recent Servers:" 
    path to "rotf" 
    -- alias "FESTPLATTE:System:" 
    path to "ƒscr" 
    -- alias "FESTPLATTE:System:Library:ScriptingAdditions:" 
    path to "scrƒ" 
    -- alias "FESTPLATTE:Users:USERNAME:Library:Scripts:" 
    path to "ƒlib" 
    -- alias "FESTPLATTE:System:Library:CFMSupport:" 
    path to "sdat" 
    -- alias "FESTPLATTE:Users:Shared:" 
    path to "sdsk" 
    -- alias "FESTPLATTE:Users:USERNAME:Desktop Folder:" 
    path to "macs" 
    -- alias "FESTPLATTE:System:" 
    path to "sprf" 
    -- alias "FESTPLATTE:System:Library:PreferencePanes:" 
    path to "temp" 
    -- alias "FESTPLATTE:private:tmp:501:Temporary Items:" 
    path to "trsh" 
    -- alias "FESTPLATTE:Users:USERNAME:.Trash:" 
    path to "usrs" 
    -- alias "FESTPLATTE:Users:" 
    path to "utiƒ" 
    -- alias "FESTPLATTE:Applications:Utilities:" 
    path to "fvoc" 
    -- alias "FESTPLATTE:System:Library:Speech:Voices:" 
    path to "root" 
    -- alias "FESTPLATTE:System:" 
    path to "empt" 
    -- alias "FESTPLATTE:Users:USERNAME:.Trash:" 
end tell 
									

DropBox Lister

Ein Freund von mir verschickt regelmäßig Emails mit Info-Material, damit er die Emails nicht unnötig aufbläst legt er diese Dateien in seiner DropBox ab und in den Mails fügt er nur noch die entsprechenden Links dazu ein.

Info Broschüre:
https://dl.dropbox.com/u/12345/Infos/Rice%20Up/DSC00932.pdf

Zusatz Broschüre:
https://dl.dropbox.com/u/12345/Infos/Rice%20Up/DSC00933.pdf

Für seinen Mac habe ich ihm dafür mal ein AppleScript geschrieben, das auch zusätzlich die Links zu den Videos seines YouTube-Kanals bereit hält.
Soweit so gut, nur auf seinem iPad bleibt ihm hierfür nur die DropBox.app und über diese App mehr als einen Link via Email zu verschicken ist … kompliziert.

Somit ist dieses AppleScript entstanden, welches einen Ordner (und Unterorder) nach Dateien durchsucht und entsprechend auf einer HTML-Seite verlinkt. Dabei handelt es sich sinnigerweise um einen Ordner der via Dropbox öffentlich zugänglich ist. Aus er Liste der Dateinamen kann man sich die Dateien auswählen die man in der Email als Link verschicken möchte und mit dem Erstelle Email-Button wird eine neue Email nach dem oben gezeigten Schema erstellt… so macht DropBox-Links verschicken mit dem iPad Spaß ;-)


[Download not found]

Outlook: Kalender Kategorien setzen

Exportiert man einen lokalen Kalender aus iCal und öffnen diesen in Outlook, wird dieser direkt hinzugefügt, nur wird man nicht gefragt, welcher Kategorie die neuen Einträge zugeordnet werden sollen. Das ist bei Kalendern, die nur über 12 Monate gehen nicht weiter schlimm, schließlich gibt es ja eine Listenansicht. Für größere Kalender mit Events über mehrere Jahre ist diese Script hier gedacht, es setzt die Kategorie alle Events ohne Kategorie auf einen wählbaren Wert. Das besondere dabei ist das Ermitteln der category id.

## 2012-05-07 hubionmac.com
## Setzt die Kateorie aller Events ohne Kategorie auf einen Auswählbaren Wert
tell application "Microsoft Outlook"
  ##Ziel-Kategrorie abfragen und ID ermitteln
  set cat_names to {}
  set cat_ids to id of every category
  set i to 0
  repeat with cat_id in cat_ids
    set i to i + 1
    set cat_names to cat_names & (i & ": " & (get name of category id cat_id) as text)
  end repeat
  set theid to item (word 1 of ((choose from list cat_names with prompt "Kaegorie auswählen:") as text) as integer) of cat_ids
  set setcounter to 0
  ##Das Skript geht davon aus, dass es sich um den 2. Kalender handelt, (Exchange)
  tell calendar 2
    repeat with thevent in (get every calendar event)
      if (get category of thevent) = {} then
        set category of thevent to {category id theid of application "Microsoft Outlook"}
        set setcounter to setcounter + 1
      end if
    end repeat
    display dialog "Die Kategorien von " & setcounter & " Events wurde gesetzt."
  end tell
  
end tell

									

Wie lösche ich “unwiederbringlich” meinen Schreibtisch per Skript

Es gibt sicherlich direkte Methoden, doch ich wählte heute eine ganz besondere. Beim Testen von einem Skript schrieb ich folgenden Code:

set thepath to path to "desk"
tell application "Mail"
  repeat with a in (get selection)
    repeat with b in (get every mail attachment of a)
      display dialog (thepath & "dd.scrpt" as rich text)
      --save b in (thepath as rich text)
    end repeat
  end repeat
end tell

									


Die verheerende Zeile habe ich sicherheitshalber mal auskommentiert. Nun, durch diese Zeile löschte mir Apple Mail auf einen Schlag den gesamten Schreibtisch =) Ich wollte heute ja auch noch etwas die Platte aufräumen… so ging das recht schnell.
Aber zahlreiche Gigabyte an Daten (ich habe eine Backup, man ist ja Profi ;-) ) sollen nicht umsonst gelöscht und wiederhergestellt worden sein, das Skript zum Speichern von Emails als PDF nebst deren Anhängen funktioniert nun wieder unter 10.7, und das ohne den Schreibtisch zu löschen =)

Mail: Wordcount einer neuen Email

Via Script auf neue noch nicht verschickte Email-Nachrichten zuzugreifen ist in Mail (wohl auch noch unter V 5.2) nicht so ohne weiteres möglich. Stattdessen muss man sich mit UI-Scripting weiterhelfen, um sich z.B. die Anzahl der Worte des just verfassten Nachrichten-Textes anzeigen zu lassen.

tell application "Mail" to display alert ("Wordcount: " & my return_wordcount_new_mail_window())
on return_wordcount_new_mail_window()
  tell application "Mail" to activate
  ##new mail window in apple mail 5.2 (Lion 10.7.3)
  tell application "System Events"
    get system attribute "sysv"
    if result is greater than or equal to 4144 then -- Mac OS X 10.3.0
      if UI elements enabled then
        tell application process "Mail"
          try
            return count of every word of (get value of static text 1 of group 1 of UI element 1 of scroll area 4 of window 1)
          on error
            return "got an error"
          end try
        end tell
      else
        beep
        display dialog "GUI Scripting is not enabled" & return & return & "Open System Preferences and check Enable Access for Assistive Devices in the Universal Access preference pane, then run this script again." with icon stop
        if button returned of result is "OK" then
          tell application "System Preferences"
            activate
            set current pane to pane "com.apple.preference.universalaccess"
          end tell
        end if
      end if
    else
      beep
      display dialog "This computer cannot run this script" & return & return & "The script uses GUI Scripting technology, which requires an upgrade to Mac OS X 10.3 Panther or newer." with icon caution buttons {"Quit"} default button "Quit"
    end if
  end tell
end return_wordcount_new_mail_window
									


Ich habe den Code unter 10.7.3 getestet, es kann aber sein, dass er bei Umstellung des Mail-GUIs (bei einer älteren oder neueren Version) nicht funktioniert… die Tücken des UI-Scriptings halt ;-)

Tips: Shortcuts und defaults

Ich liebe Shortcuts! Einem Rechner durch Gesten gewünschte Arbeitsschritte mitzuteilen, ist ja ziemlich praktisch, doch wer jeden Tag mit der Kiste arbeitet, der sehnt sich vielleicht schon mal nach einer einfacheren Methode z.B. Dateien in Emails einzufügen. Rein vom Ansatz her hat Apple es da auch gut in OSX umgesetzt und so ist vieles, was mit Drag&Drop funktioniert auch via Copy&Paste zu erledigen. Das Funktioniert besonders gut mit Texten und Dateien. Kopiert man eine Datei im Finder (cmd+c), kann man diese dann in Mail auch ganz einfach an eine Email anhängen (cmd+v).
In Lion scheint das ganze auch in Spotlight zu funktionieren. Wählt man eine Datei aus dem Suchergebnis aus, kann man diese via Drag&Drop also auch via Copy&Paste kopieren und in eine Email einfügen, so wie hier.

Ein weitere cooler Tip zu dem Thema ist die Shortcut-Sammlung von Apple, wenngleich ich die nur in Programme funktionieren, die auch die korrekten Funktionen verbaut haben und nicht wie Adobe gerne auch mal eigene Klassen für Text-Felder&Co verwenden.

Und was auch wunderbar hilft, den Alltag etwas einfach zu gestallten ist die richtige Einstellung, nicht nur vor dem Rechner, sondern auch im System. Diese von Apple aber nicht immer öffentlich (also via GUI) zugänglichen Einstellungen verhindern das Anlegen von unsichtbaren .DS_Store-Dateien auf Netzwerk-Shares oder lassen das Dock 2D-Look erscheinen… und weil das wirklich ein Schatz sein kann, habe ich die Seite hier auch noch einmal als PDF angehängt, quasi als dezentrale Datensicherung =)

Terminal: Kennworte ändern

Ich habe gerade ein paar schöne neue Tricks gefunden, wie man Kennworte via Terminal ändern kann.
Das User-Kennwort nicht etwa via passwd sonder über dscl . -passwd /Users/customer thenewpassword
Und jetzt kommt eigentlich der Oberhammer, ich habe gedacht, seitdem Keychain-Access aus dem OS entfernt wurde, könnte AppleScript gar nicht mehr auf den Schlüsselbund zugreifen, aber weit gefehlt. Es geht über ein Terminal-Programm mit dem Namen security,
also einfach security find-internet-password -s hubionmac.com | grep "acct" | cut -d '"' -f 4 für den ersten Login-Namen für hubionmac.com und
security -v 2>&1 >/dev/null find-internet-password -gs hubionmac.com | cut -d '"' -f 2 für das Kennwort…
Jetzt muss ich nur noch herausfinden, wie es hinbekomme, dass ich das ohne Abfrage-Dialog “security möchte auf den Schlüsselbund zugreifen…” laufen lasse und zwar so, dass ich das auf das Skript beschränke kann und nicht pauschal alle Zugriffe von security freischalte…

InsertLinks from Dropbox and YouTube

Ein Bekannter verschickt immer mal wieder Emails mit Info-Material an Interessenten und hat bisher die Dateien auch direkt an die entsprechende Email angehängt. Dabei entstanden schon einmal 20MB Pakete, die er durch seinen ländlichen DSL-Anschluss mühsam treiben musste. In Zeiten von DropBox und YouTube macht es aber da mehr Sinn, statt der Dateien einen Public-Link und statt Video-Dateien in Format-XY einen YouTube-Link zu verschicken, die Infos sind ja keine Staatsgeheimnisse. Zudem muss er keine übergroßen Emails verschicken und die Mailbox des Empfängers quillt nicht über.

Continue reading

Soziale Profile aus Apple Adressbuch löschen

Ich wurde von Phil angeschrieben, der verzweifelt versucht hat, das wohl erst seit kurzem im Apple Adressbuch eingeführten social profile via AppleScript zu löschen. Das Problem dabei scheint zu sein, dass ein normales delete social profile 1 of somePerson nicht funktioniert, da dieses Element kein Bestandteil der contact info ist. So zumindest meine Vermutung, wenn ich mir das AppleScript-Funktionsverzeichnis anschaue. Ich finde den Zustand ehrlich gesagt recht passend; wenn es schon so schwierig ist, sein soziales Profil bei FaceBook, Google+, Twitter & Co. wirklich zu löschen, dann sollte man es mindestens genau so schwer haben, wenn man dies via Skript auf einem Mac versucht.
Aber ich würde darüber nicht schreiben, wenn ich dafür keine Lösung parat hätte. VORSICHT, der folgende Code LÖSCHT alle sozialen Profile, der im Adressbuch ausgewählten Person!!!

--© hubionmac.com 21.03.2012
-- example code that REMOVES ALL SOCIAL PROFILES
-- from every selected person in your Address Book
-- de-facebook, de-twitter,… you contacts ;-)

set mySelectedPersons to selection

repeat with aSelectedPerson in mySelectedPersons
  set social_ids to id of (every social profile of aSelectedPerson)
  repeat with social_id in social_ids
    my delete_social_profile(aSelectedPerson, social_id)
    save
  end repeat
end repeat

on delete_social_profile(thePerson, theID)
  --handler for removing social profiles from Address Book
  --only way since social profile is not contained by contact info or something else and so delete social profile xy does not work
  -- input a single reference to a person in the address book and
  -- a the uniq ID of a social profile as text
  tell application "Address Book"
    set social_index to 0
    repeat with i from 1 to (count of every social profile of thePerson)
      if (id of social profile i of thePerson) as text = theID as text then
        set social_index to i
        exit repeat
      end if
    end repeat
    if social_index = 0 then error "error on delete_social_profile, given ID was not found in this person"
    --you cannot delete/kill a social profile, but when you remove/take away
    --all stored information (username and URL) from it, it commits suicide
    --and is removed from the address book, philosophic programming, isn't it?
    set user name of social profile social_index of thePerson to ""
    set url of social profile social_index of thePerson to ""
  end tell
end delete_social_profile