2015-01-08 1 views
0

Я очень новичок в программировании AppleScript. Это мой код, чтобы открыть приложение в 6 вечера. Я сохранил этот код как приложение, и теперь я хочу открывать это приложение автоматически ежедневно в 6 вечера без какого-либо взаимодействия с пользователем. Я хочу сделать это программно; no cron job, no Automator, без календаря, без настроек пользовательских настроек. Я хочу, чтобы код вызывал его. Является ли это возможным?Как автоматизировать приложение для ежедневного запуска в OSX

set targetTime to "6:00:00 PM" 


display dialog targetTime -- wait until we reach the target date/time 
repeat while (current date) is less than date targetTime 
    -- should be 60 

end repeat 


tell application "Myapp" 

    activate 

end tell 

-- get the time in the desired format 
on getTimeInHoursAndMinutes() 

    -- Get the "hour" 
    set timeStr to time string of (current date) 
    set Pos to offset of ":" in timeStr 
    set theHour to characters 1 thru (Pos - 1) of timeStr as string 
    set timeStr to characters (Pos + 1) through end of timeStr as string 

    -- Get the "minute" 
    set Pos to offset of ":" in timeStr 
    set theMin to characters 1 thru (Pos - 1) of timeStr as string 
    set timeStr to characters (Pos + 1) through end of timeStr as string 

    --Get "AM or PM" 
    set Pos to offset of " " in timeStr 
    set theSfx to characters (Pos + 1) through end of timeStr as string 

    return (**strong text**theHour & ":" & theMin & " " & theSfx) as string 
end getTimeInHoursAndMinutes 

ответ

3

Хотя я ценю ответ Марка Сетчелла, так как вы уже используете applescript, а затем вычисляете секунды до 6 вечера в applescript. Для вычисления времени нет необходимости иметь специальный сценарий оболочки. Попробуйте это ...

set targetTime to "6:00:00 PM" 
display dialog targetTime -- wait until we reach the target date/time 

set curTime to current date 
set futureTime to date (targetTime) 
set secondsToFutureTime to futureTime - curTime 

-- check if it's after 6PM on the current day 
-- and if so then get 6PM on the next day 
if secondsToFutureTime is less than 0 then 
    set futureTime to futureTime + (1 * days) 
    set secondsToFutureTime to futureTime - curTime 
end if 

delay secondsToFutureTime 

tell application "Myapp" to activate 
+0

Да, хороший ответ. Мое голосование :-) –

+0

@regulus: действительно, это очень хороший и простой способ сделать это. мой голос :) – vivek

1

Правильный способ сделать это с launchctl и launchd, кстати.

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

Я обычно делаю вещи в оболочке bash, поскольку мне кажется, что это проще для меня, поэтому я бы конвертировал время в считанные секунды со времен Unix Epoch (1 января 1970 года), а затем все просто, целые числа секунд. Итак, если вы входите в терминал и введите

date +%s 
1420711428 

В настоящее время на этой странице 1420711428 секунд с момента создания Epoch. Если я хочу, чтобы знать время в секундах с начала эпохи в 18:00 сегодня вечером, я просто введите это в терминале:

date -j 1800.00 +%s 
1420740000 

Теперь я могу видеть, что я должен ждать 1420740000 - 1420711428 секунд до 18:00. Я могу сделать это легко в сценарии оболочки, а также конвертировать ваши 18:00:00 в формат, который команда date ожидает, как это:

#!/bin/bash 
# 
# Get seconds till time specified by parameter 
# Usage: 
# till 18:00:00 
# 
# Get current time in seconds since epoch 
now=$(/bin/date +%s) 
#echo now: $now 

# Get passed in time in seconds since epoch 
# Remove first colon and change second to a dot, so 18:00:00 becomes 1800.00 like "date" expects 
t=${1/:/} 
t=${t/:/.} 
then=$(/bin/date -j $t +%s) 
#echo then: $then 

# Calculate difference 
diff=$((then-now)) 
echo $diff 

Я затем сохранить, что, как till и сделать его исполняемым с

chmod +x till 

то я могу сделать

./till 18:00:00 
28282 

и увидеть это 28282 секунд до 18:00:00.

Так что, я бы вставить скрипт выше внутри Applescript, а затем использовать

do shell script "<pasted code>" 

и просто ждать, количество секунд, пока вы не хотите, или изменить последнюю строку сценария sleep $diff так скрипт Безразлично до окончания таймера.

+0

Спасибо, я попробую это решение. – vivek

Смежные вопросы