使用便携软件的好处就不用我赘述了,本人是有着轻微强迫症的便携软件的狂热粉丝,我在windows平台下使用的大部分软件都是便携版的。PortableApps.com Platform 是Windows系统下比较流行的便携软件平台,PortableApps.com Launcher(以下简称PAL)是PortableApps.com开发的便携软件制作工具。本文就介绍如何制作兼容PortableApps.com Platform的便携版Evernote。
先到Evernote官网上下载最新的Evernote安装程序,然后到 这里 下载提取工具Universal Extractor, 建议下载Archive版(便携版)。
不能直接用Universal Extractor提取Evernote官方安装包,否则会出现错误而失败。要先运行一下Evernote官方安装包,等到弹出安装对话框时,点击“取消”退出安装程序,它会在%TEMP%
路径(对于Win7就是:C:\Users\Administrator\AppData\Local\Temp)下生成一个名为Evernote.msi
的Windows Installer(MSI)包,对此包用Universal Extractor提取就可得到所需的纯净的程序文件。
运行Evernote,发现它会启动Evernote.exe,EvernoteClipper.exe,EvernoteTray.exe这三个进程,在%APPDATA%
、%LOCALAPPDATA%
以及NT6.0以上的LocalLow中写入文件,在注册表HKCU\Software\Evernote
中写入键值,HKCU\Software\Evernote\Evernote\EvernotePath
的值为Evernote数据库的位置。Evernote首次运行还会在shell:sendto
中创建一个指向Evernote.exe的快捷方式,以便文件的右键菜单中有“发送到Evernote”的菜单。
我们的目标是利用PAL制作这样一个便携软件启动器(Launcher):
Launcher启动—>备份本地数据—>导入便携数据—>将数据库路径写入注册表—>启动主程序—>主程序退出—>导出便携软件数据—>清理便携软件垃圾—>恢复本地数据—>Launcher退出
PortableApps.com 提供了一个模板: PortableApps.com Application Template 2.4, 以便我们快速部署配置文件。
下载上述模板,解压后,重命名AppNamePortable为EvernotePortable。在App下新建Evernote目录,将提取出的程序文件复制到此处。
创建 App\AppInfo\appinfo.ini ,此目录下的文件主要是为PortableApps.com Platform提供程序的基本信息。使用PAL创建便携软件,此目录是不可缺少的。
在appinfo.ini中这样写:
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 | [Format] Type=PortableApps.comFormat Version=3.0 [Details] Name=Evernote Portable AppID=EvernotePortable Publisher=Evernote Corporation | yysfire Homepage=http://yysfire.github.io/tools/ Category=Office Language=Multilingual Description=Save your ideas, things you like, things you hear, and things you see. [License] Shareable=true OpenSource=false Freeware=true CommercialUse=true [Version] PackageVersion=5.7.1.5586 DisplayVersion=5.7.1 [Control] Icons=1 Start=EvernotePortable.exe |
导出Evernote.exe的图标,推荐使用IcoFX Portable,保存为App\AppInfo\appicon.ico
,并导出为appicon_16.png(16px),appicon_32.png(32px),appicon_128.png(128px,非必须),均放在App\AppInfo\
路径下。
创建App\Appinfo\Launcher\EvernotePortable.ini
,这个INI是制作便携软件的关键,它告诉PAL如何使我们的软件便携化。
参考:使用Portableapps.com Launcher制作便携软件:以Evernote Portable为例
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 | [Launch] ProgramExecutable=Evernote\Evernote.exe ;主程序位置 SinglePortableAppInstance=true ;只允许运行一个便携版实例 CloseEXE=EvernoteTray.exe ;除了Evernote.exe,当EvernoteTray.exe正在运行时,便携软件也拒绝启动。 WaitForExe1=EvernoteTray.exe ;当Evernote.exe关闭后,等待EvernoteTray.exe进程退出,EvernotePortable.exe才退出,才真正结束便携软件。 DirectoryMoveOK=yes ;路径改变并不会影响便携软件运行,因此检测到路径改变时不提示警告。 [Activate] Registry=true ;表示本软件需要写注册表 [DirectoriesMove] -=%LOCALAPPDATA%\Evernote ;当软件启动时,原%LOCALAPPDATA%\Evernote会被重命名(备份)为 ;%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable,当软 ;件结束时,%LOCALAPPDATA%\Evernote会被删除, ;%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable 被重命名(恢复) ;为%LOCALAPPDATA%\Evernote。(-=)的意思是程序结束时不将 ;%LOCALAPPDATA%\Evernote备份到便携软件Data目录,因为这几个目录主要是日志、 ;临时文件,没有备份到便携设备的必要。如果需要备份到Data目录,则将“-”指定为其 ;他名称。下同。 -=%APPDATA%\Evernote -=%USERPROFILE%\AppData\LocalLow\Evernote [DirectoriesCleanupIfEmpty] 1=%LOCALAPPDATA%\Evernote\Evernote ;如为空目录,则在结束时删除目录,避免留下垃圾文件。下同 2=%LOCALAPPDATA%\Evernote 3=%APPDATA%\Evernote 4=%USERPROFILE%\AppData\LocalLow\Evernote [RegistryKeys] EvernotePortable=HKCU\Software\Evernote ;在程序启动时,HKCU\Software\Evernote被重命名为 ;HKCU\Software\Evernote-Backup-by-EvernotePortable, ;Data\settings\EvernotePortable.reg 被导入注册表,在程 ;序结束后,反过来导出便携软件键值,恢复本机注册表项。 [RegistryValueWrite] HKCU\Software\Evernote\Evernote\EvernotePath=REG_SZ:%PAL:DataDir% ;在程序启动时,在HKCU\Software\Evernote\Evernote\EvernotePath 中写入便携 ;软件Data目录路径,以将数据库目录设定为便携软件的Data。更多PAL专有变量请参阅文档。 [RegistryCleanupIfEmpty] 1=HKCU\Software\Evernote ;如为空项,则在结束时删除,避免留下注册表垃圾。 |
PortableApps.com Platform 便携软件一般是不能通过软件自身的升级方式更新的,因此,我们需要修改程序的默认设置,关闭自动升级选项。通过观察注册表,可知Evernote自动升级主要由2个键值控制。在程序第一次运行时,需要将这两个键值设为0,以关闭默认升级。
新建App\DefaultData\settings\EvernotePortable.reg
,写入如下内容:
1 2 3 4 5 | Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Evernote\Evernote] "UpdateToPreReleaseVersion"=dword:00000000 "CheckForUpdatesAtLaunch"=dword:00000000 |
Evernote有一个残余进程EvernoteClipper.exe,并不会在程序结束后自动退出。PAL并没有结束进程的功能,因此需要用到一段Custom Code。在App\AppInfo\Launcher
目录下新建Custom.nsh,写入如下内容:
1 2 3 4 5 6 7 8 9 | ${SegmentFile} ${SegmentPrePrimary} KillProcDLL::KillProc "EvernoteClipper.exe" !macroend ${SegmentPostPrimary} KillProcDLL::KillProc "EvernoteClipper.exe" !macroend |
此代码的作用是调用NSIS的KillPorcDLL插件,在程序启动之前和退出之后,结束进程EvernoteClipper.exe。但是,似乎并不起作用。
其实,EvernoteClipper.exe并没有什么大作用,关闭它对主程序没什么影响,而它的启动是由注册表中的一个键值
HKEY_CURRENT_USER\Software\Evernote\Evernote\StartEvernoteClipper
来控制。因此,我们可以在App\DefaultData\settings\EvernotePortable.reg
中加入"StartEvernoteClipper"=dword:00000000
来关闭它的启动。
我在前面还提到,在Evernote首次启动时,会添加“发送到Evernote”的右键菜单。但是,当Evernote程序退出后,此右键菜单还存在,这不符合便携软件的理念。
解决这个问题无外乎两种思路:
对于思路一,我找到了控制Evernote安装右键菜单的注册表键值:HKEY_CURRENT_USER\Software\Evernote\Evernote\SendToLinkInstalled
,在App\DefaultData\settings\EvernotePortable.reg
中将此键值清零,结果好象不起作用。
对于思路二,可以在App\AppInfo\Launcher\Custom.nsh
中写入以下代码解决:
1 2 3 4 5 6 7 8 9 10 11 12 | !define SENDTO `$SENDTO\Evernote.lnk` ${SegmentFile} ${SegmentPrePrimary} ExpandEnvStrings $0 "%PAL:AppDir%\Evernote\Evernote.exe" CreateShortCut `${SENDTO}` `$0` !macroend ${SegmentPostPrimary} Delete `${SENDTO}` !macroend |
综合以上,文件D:\PortableApps\EvernotePortable\App\AppInfo\Launcher\Custom.nsh
最终的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | !define SENDTO `$SENDTO\Evernote.lnk` ${SegmentFile} ${SegmentPrePrimary} ExpandEnvStrings $0 "%PAL:AppDir%\Evernote\Evernote.exe" CreateShortCut `${SENDTO}` `$0` KillProcDLL::KillProc "EvernoteClipper.exe" !macroend ${SegmentPostPrimary} Delete `${SENDTO}` KillProcDLL::KillProc "EvernoteClipper.exe" !macroend |
文件App\DefaultData\settings\EvernotePortable.reg
最终的内容如下:
1 2 3 4 5 6 7 | Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Evernote\Evernote] "UpdateToPreReleaseVersion"=dword:00000000 "CheckForUpdatesAtLaunch"=dword:00000000 "StartEvernoteClipper"=dword:00000000 "SendToLinkInstalled"=dword:00000000 |
Evernote的便携化基本完成了。在 PortableApps.com Launcher 中载入 EvernotePortable 目录,按下一步编译。如果成功,会在 EvernotePortable 目录下生成 EvernotePortable.exe。
至此便携软件已经制作完毕,为便于使用与分发,可使用 PortableApps.com AppCompactor 减小软件体积,使用 PortableApps.com Installer 制作成安装(自解压)包。
EvernotePortable_5.7.1.5586 下载地址 :
本作品由 Yysfire 创作,采用进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/windows/make_and_download_portable-evernote_for_windows.html