Запретить сценарию AppleScript изменять собственную дату изменения при использовании переданных аргументов - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть скрипт AppleScript, который я использую для отображения информации о дорожке iTunes на моем рабочем столе с помощью GeekTool. Я использую on runargv для передачи различных параметров в сценарий, чтобы я мог отображать различные части информации о дорожке без дублирования сценария (например, я могу получить только название, запустив osascript itunes.scpt title, и я могу получить исполнителя / альбом с помощью работает osascript itunes.scpt album).

Однако каждый раз, когда я запускаю сценарий с аргументом, фактическая дата изменения файла изменяется - кажется, что сценарий записывает что-то для себя или делает какую-то модификацию.

Обычно это не проблема, за исключением OS X 10.7, где Lion ввел блокировку файлов для файлов, которые не были изменены более 2 недель. После того, как мой скрипт iTunes заблокирован ОС, он больше не может выполнять эти невидимые самообновления при запуске, и в моем системном журнале появляются ошибки, подобные этой:

osascript: couldn't save changes to script /path/to/script: error -54

Я могу это временно исправить, внеся некоторые изменения в сценарий вручную (например, добавив пустые строки), но через две недели все снова выходит из строя, потому что Лев его блокирует.

Я мог бы теоретически отключить блокировку файлов по всей системе, чтобы это исправить, но я бы предпочел этого не делать - мне это нравится для других вещей.

Итак, как вы можете использовать on run argv для передачи аргументов в файлы AppleScript без изменения даты изменения этого скрипта?

Вот минимальный рабочий пример. Если вы запустите это из командной строки (oscascript test.scpt blah), дата изменения скрипта изменится.

--test.scpt
on run argv
    tell application "iTunes"
        if player state is playing then
            set trck to current track
            set title_text to (get name of trck)
            return title_text & " " & item 1 of argv
        end if
    end tell
end run

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

В дополнение к свойствам, которые определены в обычном AppleScript (не в разновидности Xcode), все глобальные переменные являются постоянными и сохраняются со сценарием (по крайней мере, до его перекомпиляции).Это включает в себя элементы, определенные в обработчике run (явном или подразумеваемом), например:

on run
    try
        display dialog someVariable -- will error the first time
    on error -- set global
        beep
        set someVariable to time string of (current date)
    end try
end run

Вы можете попробовать переместить код в обработчик, чтобы глобальные переменные не были установлены илиизмененное.

0 голосов
/ 28 февраля 2012

Вы можете попробовать передать скрипт на osascript через стандартный ввод вместо того, чтобы читать его напрямую.

osascript - args < /path/to/script 

или

cat /path/to/script | osascript - args

Вам нужна тире (см. Страницу руководства).для osascript)

Однако я не могу воспроизвести поведение, измененное во время модификации (я на Snow Leopard), поэтому я не знаю, будет ли это иначе.Но это может сработать, поскольку osascript не имеет прямого контакта с файлом (если это действительно ошибка osascript).

Странная проблема в любом случае

...