2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的!

1、在安装脚本的开始处定义 LIBRARY_X64。

!include "MUI.nsh"
!include "Library.nsh"

;如果做32位安装包就把下句注释。
!define LIBRARY_X64

2、在调用涉及目标机器上系统目录(即$SYSDIR)的函数前用 ${DisableX64FSRedirection}。

在安装包的第一个Section中调用一次即可。
!ifdef LIBRARY_X64
${DisableX64FSRedirection}
!endif

之前问题主要在于64位重定向问题,所以自己用python写了个脚本。找到了NSIS禁用重定向方法就可以无论32位还是64位都可以使用NSIS来写脚本了。

原文:

前些天自己做了一年多的软件成功交付客户,客户提出些完善意见,其中一条就是要一个软件安装脚本。

这个之前也尝试python做过,只不过当时有更紧急的任务,最后就没深入尝试。

这次我就捡起了之前的python工程,继续做做。

整个过程很简单:

1,把软件解压到客户选择的目录

2,把一个dll程序复制到windowssystem32目录

3,创建一个桌面快捷方式

因为就这么几步,所以我以为很容易搞,就选择了久违的python自己写,而没有选择一些成熟的自动生成脚本工具。

首先肯定要有个界面吧,主要是要用户选择安装目录。我用Tkinter写了个简陋的界面,这个不多说。

解压压缩包的话,python有很好的库zipfile:

def 

创建桌面快捷方式python肯定也有库,但我最后选择了使用bat脚本。

set Program=这里要写快捷方式对应的程序目录,且必须是绝对路径。

在python里将这个路径填写上,然后程序里运行bat脚本即可。

echo off

上面都算顺利,最后竟然在本以为很简单的复制文件到系统目录上出了问题。

不管怎样努力,都没法将文件复制到windowssystem32目录下。

一开始本以为是权限问题。

在程序开始前加入这样的代码:

def 

这样在运行前就会弹窗要求获取管理员权限。

按道理这样程序就已经有了管理员权限了,可还是没有复制到system32目录下。

后来在同事帮我看这个问题,他弄了一会,发现其实是64位系统下,系统自动重定向到C:WindowsSysWOW64目录下了!

所以一定要在复制操作前,禁止重定向。

    with disable_file_system_redirection():shutil.copy2('sdfp_lib.dll',os.getenv("SystemDrive")+'windowssystem32')

上述,便是用python写我的软件自动安装脚本的全过程,后面会附上我的全部代码。

我先再讲下要实现这种软件自动安装脚本需求 最常用最合适的实现方法。

其实用工具自动生成就好了!

这个HM NIS Edit工具。

点击文件,选择新建脚本向导。

然后按照向导一般的安装,基本的安装需求都可以简单实现。

重点是这一步:

左边可以添加分组,右边可以给每个分组添加安装指令,可以给组添加单独的文件,也可以给组添加主程序目录。每个组再配置安装目标目录。这个目标目录有很多选择,包括系统目录、用户选择目录…………不赘述。

这个工具编译好脚本,就生成了一个Setup.exe文件。这就是安装程序。要安装的软件文件都包含在这个exe里了,很厉害。

按道理,只要用这个工具就可以完成我的需求了,但在64位系统还有些问题,那就是依然会有系统重定向现象。本来要复制到system32目录下的dll还是会被复制到C:WindowsSysWOW64下。

最后我就决定,做两个版本。

32位的安装程序用HM NIS Edit工具自动生成。

64位我自己用python写。

另外,python转化成exe文件的写法,之前文章介绍过:

https://www.cnblogs.com/rixiang/p/7274026.html

附上py完整代码:

# -*- coding: utf-8 -*-
from __future__ import print_function
from Tkinter import *
import os
import sys
import subprocess
import shutilreload(sys)
defaultencoding = 'utf-8'
import ctypesimport tkFileDialog as filedialog
import zipfile
from shutil import copyfileclass disable_file_system_redirection:_disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection_revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirectiondef __enter__(self):self.old_value = ctypes.c_long()self.success = self._disable(ctypes.byref(self.old_value))def __exit__(self, type, value, traceback):if self.success:self._revert(self.old_value)def unzip(zipFilePath, destDir):zfile = zipfile.ZipFile(zipFilePath)for name in zfile.namelist():(dirName, fileName) = os.path.split(name)if fileName == '':# directorynewDir = destDir + '/' + dirNameif not os.path.exists(newDir):os.mkdir(newDir)else:# filefd = open(destDir + '/' + name, 'wb')fd.write(zfile.read(name))fd.close()zfile.close()def choose_directory():global dir_choosenglobal dir_choosen2dir_choosen = filedialog.askdirectory(initialdir='C:')# unzip my program to directory choosendir_choosen2 = dir_choosendir_choosen = dir_choosen + '/tgsoft'if not os.path.exists(dir_choosen):os.makedirs(dir_choosen)entryText.set(dir_choosen)def install():if dir_choosen2.strip()=='' or dir_choosen.strip()=='':return -1unzip('tgsoft.zip',dir_choosen)with disable_file_system_redirection():shutil.copy2('sdfp_lib.dll',os.getenv("SystemDrive")+'windowssystem32')str_bat = ''f = open('CREATE_SHORTCUT.bat', 'r')line = f.readline()             while line:str_bat+=lineline = f.readline()f.close()nPos=str_bat.index('=')+1str_bat = str_bat[:nPos]+dir_choosen2+"tgsoftManagerSoftware.exe"+str_bat[nPos:]f = open('CREATE_SHORTCUT2.bat', 'w') # 若是'wb'就表示写二进制文件f.write(str_bat)f.close()child = subprocess.Popen('CREATE_SHORTCUT2.bat',shell=False)# reset the windowfile_label.destroy()file_entry.destroy()file_btn.destroy()b2.destroy()w = Label(master, text="安装成功n感谢使用")w.grid(row=0)    def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return Falseif is_admin():global mastermaster = Tk()master.title('指静脉注册软件安装程序')master.geometry('400x100')global file_labelfile_label = Label(master, text="选择软件安装路径")file_label.grid(row=0)global entryTextentryText = StringVar()global file_entryfile_entry = Entry(master,textvariable=entryText)file_entry.grid(row=0, column=1)global file_btnfile_btn = Button(master, text='点击选择路径', command=choose_directory)file_btn.grid(row=0,column=2)global b1b1 = Button(master, text='  退 出  ', command=master.quit)b1.grid(row=1,column=0)global b2b2 = Button(master, text='  确 定  ', command=install)b2.grid(row=1,column=1)mainloop()
else:# Re-run the program with admin rightsctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

ctypes安装_用python amp; bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本相关推荐

  1. python写魔兽世界脚本_用python bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本...

    2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh" !incl ...

  2. 网页一键生成app软件_施工方案不会写?4个工程人必备的自动生成软件,一键生成超便利!...

    对于工程人来说,施工方案和技术交底的编制是基本功,但对于新人来说,编制和整理起来还是有一定难度的. 今天整理了工程人必备的自动生成软件,可以自动生成技术交底.施工方案.施工横道图和施工图等,安装快速, ...

  3. Python——windows下pip换源 和 自动生成和安装requirements.txt

    当自己电脑(Windows系统)装python的第三方包出现timeout时,一般就是下载速度太慢了.采取的方法可以跟换pip的下载源. 转载文章的链接:[python]windows下pip换源 P ...

  4. 画【Python折线图】的一百个学习报告(三、自动生成单一数据折线图)

    画[Python折线图]的一百个学习报告(三.自动生成单一数据折线图) 目录 画[Python折线图]的一百个学习报告(三.自动生成单一数据折线图) 前言 学习环境 探究目标 分析过程 实践过程 成果 ...

  5. opencv在python环境下的安装_关于python环境下的opencv安装

    吐槽: 这一天我终于记起了这个博客.今天搞python环境下的opencv,又弄了一天,很烦躁.之前配置VS的opencv也是花了好久的时间,然后突然发现之前记录在电脑上的文档都找不到了,于是决定还是 ...

  6. python实现程序安装_使用python实现对windows软件包的安装和卸载

    在对windows安装包产品进行测试时,安装和卸载是难免的,并且人工的手动安装和卸载会花费大量的精力和时间,为此需要编写一个脚本来实现对windows安装包产品的自动卸载和安装. 首先参考了 http ...

  7. python第三方库批量安装_使用Python批量安装第三方库

    Python的很多功能通过第三方库实现,99%的第三方库可以通过Python自带的pip方法进行自动下载和安装.然而Python有几十万个第三方库,最常用的也有几十个.想要一次性地安装几十个常用的第三 ...

  8. python json库安装_【Python基础】安装python第三方库

    pip命令行安装(推荐) 打开cmd命令行 安装需要的第三方库如:pip install numpy 在安装python的相关模块和库时,我们一般使用"pip install 模块名&quo ...

  9. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...

    游戏是为了什么而存在的?Bingo,是为了娱乐~ 在这个最高主题之前,技术啥的什么都无所谓! 前一段时间,有位姓刘的网友用Pygame写了个俄罗斯方块,在用py2exe打包的时候遇到一些问题,和我交流 ...

最新文章

  1. IDEA开启关闭拼写检查
  2. BZOJ 3872 ant colony
  3. 文件服务器文件多备份方案,windows文件服务器冗余备份方案.doc
  4. NIO和BIO如何影响应用程序的设计-API调用
  5. .netcore 分布式事务CAP2.6 快速入门
  6. 高中计算机网络技术专业的自我鉴定,计算机网络技术专业的自我鉴定(精选5篇)...
  7. Android 8(1),腾讯字节爱奇艺网易华为实习面试汇总
  8. 阿里矢量图标(字体图标)
  9. 锂电池UN38.3测试项目介绍
  10. 【Meta Learning学习笔记】Meta Learning详解
  11. 小卡与质数2全网最简单思路 看不懂你来打我
  12. 搭建区块链浏览器——基于hyperledger fabric 1.0,MySQL容器
  13. web页面:窗口切换
  14. Android+Java Web+MySQL实现登录注册
  15. 随机点名器的实现!!!
  16. MATLAB的Roberts算子与Sobel算子
  17. 【聚类算法】什么是聚类
  18. 中秋福利PK!2017公司月饼哪家强?腾讯、阿里、百度、京东、网易等21家中秋月饼盘点!(完整版)
  19. 北科大matlab第一次作业,北京科技大学应用计算方法作业与答案
  20. 收购的产品你能坚持多久(谈广域网优化的市场格局)

热门文章

  1. extundelete反删除总结
  2. JavaEE基础(03):Http请求详解,握手挥手流程简介
  3. TCP/IP入门(3) --传输层
  4. Redis-字符串(string)基础
  5. [HBase_3] HBase 命令
  6. Qt 给控件QLineEdit添加clicked事件方法
  7. 计算字符在字符串中出现的次数
  8. [Android] Bitmap OOM解决办法一
  9. 指尖初体验之主屏幕操作
  10. 今天完成了share memory的测试