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程序复制到windows\system32目录

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

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

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

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

def unzip(zipFilePath, destDir):

zfile = zipfile.ZipFile(zipFilePath)

for name in zfile.namelist():

(dirName, fileName) = os.path.split(name)

if fileName == '':

# directory

newDir = destDir + '/' + dirName

if not os.path.exists(newDir):

os.mkdir(newDir)

else:

# file

fd = open(destDir + '/' + name, 'wb')

fd.write(zfile.read(name))

fd.close()

zfile.close()

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

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

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

@ echo off

set Program=

set LnkName=manager software

set WorkDir=

set Desc=soft

if not defined WorkDir call:GetWorkDir "%Program%"

(echo Set WshShell=CreateObject("WScript.Shell"^)

echo strDesKtop=WshShell.SpecialFolders("DesKtop"^)

echo Set oShellLink=WshShell.CreateShortcut(strDesKtop^&"\%LnkName%.lnk"^)

echo oShellLink.TargetPath="%Program%"

echo oShellLink.WorkingDirectory="%WorkDir%"

echo oShellLink.WindowStyle=1

echo oShellLink.Description="%Desc%"

echo oShellLink.Save)>makelnk.vbs

echo SUCCESS

makelnk.vbs

del /f /q makelnk.vbs

exit

goto :eof

:GetWorkDir

set WorkDir=%~dp1

set WorkDir=%WorkDir:~,-1%

goto :eof

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

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

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

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

def is_admin():

try:

return ctypes.windll.shell32.IsUserAnAdmin()

except:

return False

if is_admin():

#主程序代码

else:

# Re-run the program with admin rights

ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

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

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

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

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

with disable_file_system_redirection():

shutil.copy2('sdfp_lib.dll',os.getenv("SystemDrive")+'\\windows\\system32')

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

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

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

这个HM NIS Edit工具。

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

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

重点是这一步:

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

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

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

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

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

64位我自己用python写。

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

附上py完整代码:

# -*- coding: utf-8 -*-

from __future__ import print_function

from Tkinter import *

import os

import sys

import subprocess

import shutil

reload(sys)

defaultencoding = 'utf-8'

import ctypes

import tkFileDialog as filedialog

import zipfile

from shutil import copyfile

class disable_file_system_redirection:

_disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection

_revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection

def __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 == '':

# directory

newDir = destDir + '/' + dirName

if not os.path.exists(newDir):

os.mkdir(newDir)

else:

# file

fd = open(destDir + '/' + name, 'wb')

fd.write(zfile.read(name))

fd.close()

zfile.close()

def choose_directory():

global dir_choosen

global dir_choosen2

dir_choosen = filedialog.askdirectory(initialdir='C:')

# unzip my program to directory choosen

dir_choosen2 = dir_choosen

dir_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 -1

unzip('tgsoft.zip',dir_choosen)

with disable_file_system_redirection():

shutil.copy2('sdfp_lib.dll',os.getenv("SystemDrive")+'\\windows\\system32')

str_bat = ''

f = open('CREATE_SHORTCUT.bat', 'r')

line = f.readline()

while line:

str_bat+=line

line = f.readline()

f.close()

nPos=str_bat.index('=')+1

str_bat = str_bat[:nPos]+dir_choosen2+"\\tgsoft\\ManagerSoftware.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 window

file_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 False

if is_admin():

global master

master = Tk()

master.title('指静脉注册软件安装程序')

master.geometry('400x100')

global file_label

file_label = Label(master, text="选择软件安装路径")

file_label.grid(row=0)

global entryText

entryText = StringVar()

global file_entry

file_entry = Entry(master,textvariable=entryText)

file_entry.grid(row=0, column=1)

global file_btn

file_btn = Button(master, text='点击选择路径', command=choose_directory)

file_btn.grid(row=0,column=2)

global b1

b1 = Button(master, text=' 退 出 ', command=master.quit)

b1.grid(row=1,column=0)

global b2

b2 = Button(master, text=' 确 定 ', command=install)

b2.grid(row=1,column=1)

mainloop()

else:

# Re-run the program with admin rights

ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

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

  1. ctypes安装_用python amp; bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本

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

  2. 技术交底软件_中建总局出品:1200套施工方案+4个自动生成软件,限时领取

    http://t.csdn.cn/JPTWAhttp://t.csdn.cn/JPTWA

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

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

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

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

  5. 根据Word表格自动生成SQL数据库脚本的VBScript代码

    这是几年前写的根据Word表格自动生成SQL数据库脚本的VBScript代码,最近修改了下(原来只支持单个Word表格)使其支持一个Word文档中的多个表格,生成的SQL文件名以Word文件名+.SQ ...

  6. NSG2-一个很好用的ns2的tcl脚本自动生成软件

    NSG2-一个很好用的ns2的tcl脚本自动生成软件 来源:Linux社区 作者:fzxy002763 NSG2-一个很好用的ns2的tcl脚本自动生成软件,NSG2.rar,一个很好的java写的t ...

  7. 自动生成卡密SQL脚本(转载)

    Comments - 446 自动生成卡密SQL脚本(转载) Code if exists (select * from dbo.sysobjects where id = object_id(N'[ ...

  8. java调用python脚本_调用Python写vb的脚本方法

    某个项目中涉及到这样一个情景: VB写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下所示: ...

  9. python网络游戏脚本_用Python写一个游戏脚本,你会吗?

    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手.如果你也想多练项目实战.可以去小编的Python交流.裙 :一久武其而而流一思(数字的谐 ...

最新文章

  1. C++ 笔记(31)— 类继承
  2. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件
  3. Iterator、Iterable接口的使用及详解
  4. Mish = x*tanh(ln(1+e^x))
  5. 关于MySQL出现锁等待lock wait timeout exceeded; try restarting transaction 的解决方案
  6. codeforces 528D. Fuzzy Search 快速傅里叶变换
  7. 领域驱动专家张逸文字脱口秀:简单工厂不简单
  8. Calico搭建配置
  9. 【英语学习】【Level 08】U02 Movie Time L1 Let's talk about movies
  10. servlet请求的执行过程_Springmvc执行流程
  11. mongodb最多数据库_2020 年3 月数据库排行:前 10 整体下行,出新技术了?
  12. Linux架构之NFS共享存储1
  13. Maven 国内镜像
  14. Ubuntu 18.04 rc.local systemd设置
  15. Storm Trident示例broadcast
  16. 语言编奇数和合偶数和_Go语言基础(三)
  17. 华为、H3C、锐捷、思科四大厂商交换机配置命令,网工人不得不知
  18. 【前端教程】如何监控网页崩溃?
  19. 【RPC Dubbo】本地存根和本地伪装
  20. Bayesian information criterion和 Akaike information criterion中的模型参数个数(自由度)计算 | 以高斯混合分布为例

热门文章

  1. 2*2矩阵训练集比例对BP神经网络分类性能影响
  2. 并行多机调度遗传算法调参记录---变异和淘汰哪个更重要?
  3. java示例_Java入门示例
  4. android phone驱动_一文带你掌握 Android 系统架构
  5. 【Paper】2020_GrHDP Solution for Optimal Consensus Control of Multiagent Discrete-Time Systems
  6. 【arduino】亲测MAC上arduino安装ESP32 SPIFFS插件
  7. 【Android工具】好软件推荐,安卓手机免费好用的SSH客户端——JuiceSSH
  8. 【OMP信道估计】基于OMP压缩感知的信道估计算法的MATLAB仿真
  9. STM32硬件错误(HardFault_Handler)位置判断
  10. JAVA入门笔记·JAVA名词及环境搭建