快速提高工作效率-Mac自动化脚本

快速提高工作效率-Mac自动化脚本

工作以后,事情非常多,如何更好的管理自己的工作是非常重要的。

本文介绍了如何利用Mac中自动化脚本,快速提高自己的工作效率。

定时任务


作为一名刚刚进入公司的应届毕业生,工作量相比学生时代呈几何增长。为了规划自己每天的工作任务,建立每日的工作日志是非常重要的。然后人工的建立每日工作目录,有点太慢了。因此开始考虑如何利用Mac中的自动化脚本帮助自己定时的生成每日工作日志。

除此之外,在公司还会面临每日的订餐、打卡、周报等重复性的工作。工作忙时,经常会忘记这些基础类的工作。因此为了防止自己错过美食时间,我也在我的Mac中加入了定时的弹窗提醒。

定制化脚本


在Mac中其实有两种定制化脚本的方法。第一种是苹果推荐的AppleScript。第二种则可以使用Shell脚本来执行一些任务。其实如果对AppleScript了解深入的话,我个人更推荐使用AppleScript来执行一些任务。

AppleScript

AppleScript 脚本执行需要使用 osascript 命令。有关 osascript 命令的具体使用可以参见 osascript man 页面

下面简单的展示了一条osascript:

osascript -e 'display notification "通知内容" with title "标题" subtitle "子标题"'

这条指令调用了通知栏,会弹出一条通知消息。如下图所示 -w1053

很多时候我们更需要弹窗的方式,提醒我们一些必须做的时间。比如到点了,我希望系统能提醒我订餐,防止我错过订餐时间。这时候就可以采用 AppleScript 脚本,来执行一些更为复杂的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
on callmeican()
set meican_url to "http://waimai.meituan.com/?utm_campaign=baidu&utm_source=1522" as string
tell application "Google Chrome"
open location meican_url
activate
end tell
end callmeican

say "不要这么拼了,预订美餐时间到了"

display dialog "订餐时间截至时间16:30!" buttons {"好的", "我不定了"} default button 1

if the button returned of the result is "好的" then
-- action for 1st button goes here
callmeican()

这条脚本会调用弹框,如果点击了确定会通过chrome帮我打开订餐网站。效果如下 -w420

一般来说,对于一些每天必须要做的事情,可以通过弹窗的方式。快速打开网页,快速完成工作。

其实除了Mac上自带的 AppleScript 脚本,我们也可以基于Unix的Shell脚本编写一些自动化脚本。比如生成每日的工作目录。

Shell脚本

工作以后,每天的工作都很杂。因此管理每日工作日志变得非常重要。对于每日生成日志这样重复性的工作,我尝试通过Shell脚本帮助我生成日志。

每日工作日志分为三个脚本,一个是每天生成的,还有一个则为每周生成,最后则为每月生成。

下面是我每日生成工作日志的脚本 task_Day.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/sh


#先设置语言为中文
export LANG="zh_CN"
#二
data_today=`date +%a`
#2
week_day=`date +%w`

#判断是否为周日
if [[ $week_day -eq 0 ]]; then
#statements
week_day=7
fi

if [[ $week_day -eq 1 ]]; then
#statements
`/Users/xxx/Desktop/Code/Shell/Task/task_Weekday.sh`
fi

#2018.08.28
data_info=`date +%Y.%m.%d`
#28
data_daka=`date +%d`
data_shenyu=`expr 25 - $data_daka`
#普通文件
# kaitou="今天是"${data_info}。"\n\n每天都有一个好心情,加油!\n\n今天的主要任务是:"
#markdown开头
kaitou=">今天是"${data_info}"\n>**数据备份了么!系统更新记得重新备份!!!**\n>今天打卡了么!离25号还有"${data_shenyu}",[赶紧填工时!](http://itmp.sf-express.com/loginmgmt/frame.action?name=timemgmt&frameSize=1)\n>加油!你是最胖的!\n\n##今天的主要任务是:\n\n* [x] \n\n* [ ]"



#计算当前周日期 1
to_monday=`expr $week_day - 1`
to_sunday=`expr 7 - $week_day`

monday=`/bin/date -v -${to_monday}d +%d`
sunday=`/bin/date -v +${to_sunday}d +%d`




#计算月份、以周一的月份为准
Month=`/bin/date -v -${to_monday}d +%Y年%m月`
Time=`date`
folder_name=${monday}"-"$sunday
Data_name=`date +%A`

#判断是否是周末
if [[ $week_day -lt 6 ]]; then

#进入工作目录
cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month/$folder_name
mkdir $Data_name
echo '今天是'${Data_name}'已经创建了当天的工作目录-'$Data_name'---创建时间是:'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Day.log
#进入当天工作目录
cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month/$folder_name/$Data_name
#普通文件
#touch ${data_info}"-工作日志"
#echo $kaitou >> ${data_info}"-工作日志"

#markdown
touch ${data_info}"-工作日志.md"
echo $kaitou >> ${data_info}"-工作日志.md"


else
echo '今天是'${data_info}'。好好休息!~~~~下周继续加班呦'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Day.log
fi

task_Weekday.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/sh
#获取一周日期date -v +4d +%Y-%m-%d
export LANG="zh_CN"

week_day=`date +%w`
to_monday=`expr $week_day - 1`
to_sunday=`expr 7 - $week_day`

monday=`/bin/date -v -${to_monday}d +%d`
sunday=`/bin/date -v +${to_sunday}d +%d`

Month=`date +%Y年%m月`
Year=`date +%Y年`
Week=`date +%W周`
Time=`date`
folder_name=${monday}"-"$sunday

#工作总结撰写
zhoubaotime_today=`date +%Y.%m.%d`
zhoubaotime_five=`date -d 'friday' +%Y.%m.%d`

zhoubaoname="("${zhoubaotime_today}"~"$zhoubaotime_five")工作周报"
zhoubaomd=$zhoubaoname'.md'
mk_kaitou=">"$zhoubaoname"\n\n>"$Year"共有52周\n本周是第"$Week"\n\n##本周的主要工作为: \n\n* \n\n* \n\n-------\n\n*以下为每天的工作内容*\n\n####周一\n* [ ] \n* [ ]\n\n####周二\n* [ ] \n* [ ] \n\n####周三\n* [ ] \n* [ ]\n\n####周四\n* [ ] \n* [ ]\n\n####周五\n* [ ] \n* [ ]"

# zhoubaoname="("${zhoubaotime_today}"~"$zhoubaotime_five")工作周报"
# kaitou=$zhoubaoname"\n\n"$Year"共有52周,本周是第"$Week"。\n\n本周的主要工作为:\n\n以下为每天的工作内容:\n\n周一:\n\n周二:\n\n周三:\n\n周四:\n\n周五:"


cd /Users/xxx/Desktop/SF-Resource/工作日志/ &&
#创建工作日志文档(判断 月份)
if [ ! -d $Month ];then
`/Users/xxx/Desktop/Code/Shell/Task/task_Month.sh`
#运行完成写入日志
echo '成功创建了文件夹'$Month >> /Users/xxx/Desktop/Code/Shell/Log/task_Month.log
fi

cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month

#本周文档创建
if [[ ! -d $folder_name ]]; then
mkdir $folder_name
echo '成功创建了文件夹--'$folder_name '---创建时间是:'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log
cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month/$folder_name &&
touch $zhoubaomd && echo $mk_kaitou >> $zhoubaomd
echo '成功创建了周报'$zhoubaomd '---创建时间是:'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log

else
#输出错误日志
echo $folder_name"文件夹已经存在,创建失败"$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log

fi

task_Month.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/sh
#获取一周日期date -v +4d +%Y-%m-%d
export LANG="zh_CN"

week_day=`date +%w`
to_monday=`expr $week_day - 1`
to_sunday=`expr 7 - $week_day`

monday=`/bin/date -v -${to_monday}d +%d`
sunday=`/bin/date -v +${to_sunday}d +%d`

Month=`date +%Y年%m月`
Year=`date +%Y年`
Week=`date +%W周`
Time=`date`
folder_name=${monday}"-"$sunday

#工作总结撰写
zhoubaotime_today=`date +%Y.%m.%d`
zhoubaotime_five=`date -d 'friday' +%Y.%m.%d`

zhoubaoname="("${zhoubaotime_today}"~"$zhoubaotime_five")工作周报"
zhoubaomd=$zhoubaoname'.md'
mk_kaitou=">"$zhoubaoname"\n\n>"$Year"共有52周\n本周是第"$Week"\n\n##本周的主要工作为: \n\n* \n\n* \n\n-------\n\n*以下为每天的工作内容*\n\n####周一\n* [ ] \n* [ ]\n\n####周二\n* [ ] \n* [ ] \n\n####周三\n* [ ] \n* [ ]\n\n####周四\n* [ ] \n* [ ]\n\n####周五\n* [ ] \n* [ ]"

# zhoubaoname="("${zhoubaotime_today}"~"$zhoubaotime_five")工作周报"
# kaitou=$zhoubaoname"\n\n"$Year"共有52周,本周是第"$Week"。\n\n本周的主要工作为:\n\n以下为每天的工作内容:\n\n周一:\n\n周二:\n\n周三:\n\n周四:\n\n周五:"


cd /Users/xxx/Desktop/SF-Resource/工作日志/ &&
#创建工作日志文档(判断 月份)
if [ ! -d $Month ];then
`/Users/xxx/Desktop/Code/Shell/Task/task_Month.sh`
#运行完成写入日志
echo '成功创建了文件夹'$Month >> /Users/xxx/Desktop/Code/Shell/Log/task_Month.log
fi

cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month

#本周文档创建
if [[ ! -d $folder_name ]]; then
mkdir $folder_name
echo '成功创建了文件夹--'$folder_name '---创建时间是:'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log
cd /Users/xxx/Desktop/SF-Resource/工作日志/$Month/$folder_name &&
touch $zhoubaomd && echo $mk_kaitou >> $zhoubaomd
echo '成功创建了周报'$zhoubaomd '---创建时间是:'$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log

else
#输出错误日志
echo $folder_name"文件夹已经存在,创建失败"$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Weekday.log

fi

[xxx@SF-xxx:] ~/Desktop/Code/Shell/Task $ cat task_Month.sh
#!/bin/sh
#获取年月
export LANG="zh_CN"
Month=`date +%Y年%m月`
Time=`date`
cd /Users/xxx/Desktop/SF-Resource/工作日志/ &&
#创建工作日志文档(判断)
if [ ! -d $Month ];then
mkdir $Month
#运行完成写入日志
echo $Time'成功创建了文件夹'$Month >> /Users/xxx/Desktop/Code/Shell/Log/task_Month.log
else
echo $Month"文件夹已经存在,创建失败"$Time >> /Users/xxx/Desktop/Code/Shell/Log/task_Month.log

当运行task_Day.sh的时候,首先会判断今天是否为周末。如果不是的话就会去寻找创建当日的工作目录,并生成相应的工作日志。如果判断出当日为周一,或者新月份的开始,则会调用相应的脚本。生成对于的工作目录。

Mac下的定时任务

在 Mac 中定时任务的运行,推荐使用 Schedule jobs using launchd。需要我们手动写一个plist来创建一个定时任务

plis的编写有专门的语法,感兴趣的同学可以去学习一下。其实如果是简单使用的话,还是很简单的。

如下是我创建的plist程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Label唯一的标识 -->
<key>Label</key>
<string>wang.Backup.task.plist</string>
<!-- 指定要运行的脚本 -->
<key>ProgramArguments</key>
<array>
<!-- 指定要运行的脚本 -->
<string>osascript</string>
<string>/Users/xxx/Desktop/Code/Shell/Task/backup.scpt</string>
</array>
<!-- 指定要运行的时间 -->

<!-- <key>StartInterval</key>
<integer>5</integer> -->

<key>StartCalendarInterval</key>
<dict>
<key>Weekday</key>
<integer>1</integer>
<key>Minute</key>
<integer>30</integer>
<key>Hour</key>
<integer>11</integer>
</dict>
<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/xxx/Desktop/Code/Shell/Log/food.log</string>
<!-- 标准错误输出文件,错误日志 -->
<key>StandardErrorPath</key>
<string>/Users/xxx/Desktop/Code/Shell/Log/food.err</string>
</dict>
</plist>xxx

其中 “<array>” 标签中指定了运行脚本的位置, “<string>” 中则指定了运行脚本的解析器。

对于指定的运行时间,则包括了Hour Day Month 等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- Minute <integer>
The minute on which this job will be run.

Hour <integer>
The hour on which this job will be run.

Day <integer>
The day on which this job will be run.

Weekday <integer>
The weekday on which this job will be run (0 and 7 are Sunday).

Month <integer>
The month on which this job will be run. -->

plist编写完毕以后,我们需要将文件放到对应的位置中。并通过命令将定时任务加载到系统任务中。定时任务的启动分为以下4个位置,一般放第一个位置就可以(这里要注意一些文件的执行权限问题):

1
2
3
4
5
~/Library/LaunchAgents 由用户自己定义的任务项(放这里,注意权限问题)
/Library/LaunchAgents 由管理员为用户定义的任务项
/Library/LaunchDaemons 由管理员定义的守护进程任务项
/System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
/System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项

最后我们需要通过命令,将任务加载到系统的进程中。以下列出了加载任务所使用的一些命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 
# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上
$ launchctl load -w com.demo.plist

# 删除任务
$ launchctl unload -w com.demo.plist

# 查看任务列表, 使用 grep '任务部分名字' 过滤
$ launchctl list | grep 'com.demo'

# 开始任务
$ launchctl start com.demo.plist

# 结束任务
$ launchctl stop com.demo.plist -->

希望大家通过这篇博文,能够更加高效的利用手里的Mac。将工作中大量的重复工作,通过脚本的方式自动运行。 最后祝所有刚步入工作岗位的应届生么,在公司工作愉快!

Donate comment here