python写魔兽世界脚本_⽤pythonbat写软件安装脚本
+HMNISEdit⾃动⽣成。。。
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 ists(newDir):
os.mkdir(newDir)
else:
# file
fd = open(destDir + '/' + name, 'wb')
fd.ad(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
能运行python的软件上⾯都算顺利,最后竟然在本以为很简单的复制⽂件到系统⽬录上出了问题。
不管怎样努⼒,都没法将⽂件复制到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", utable), unicode(__file__), None, 1)
这样在运⾏前就会弹窗要求获取管理员权限。
按道理这样程序就已经有了管理员权限了,可还是没有复制到system32⽬录下。
后来在同事帮我看这个问题,他弄了⼀会,发现其实是64位系统下,系统⾃动重定向到C:\Windows\SysWOW64⽬录下了!
所以⼀定要在复制操作前,禁⽌重定向。
with disable_file_system_redirection():
上述,便是⽤python写我的软件⾃动安装脚本的全过程,后⾯会附上我的全部代码。
我先再讲下要实现这种软件⾃动安装脚本需求 最常⽤最合适的实现⽅法。
其实⽤⼯具⾃动⽣成就好了!
这个HM NIS Edit⼯具。
点击⽂件,选择新建脚本向导。
然后按照向导⼀般的安装,基本的安装需求都可以简单实现。
重点是这⼀步:
左边可以添加分组,右边可以给每个分组添加安装指令,可以给组添加单独的⽂件,也可以给组添加主程序⽬录。每个组再配置安装⽬标⽬录。这个⽬标⽬录有很多选择,包括系统⽬录、⽤户选择⽬录…………不赘述。
这个⼯具编译好脚本,就⽣成了⼀个⽂件。这就是安装程序。要安装的软件⽂件都包含在这个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 ists(newDir):
os.mkdir(newDir)
else:
# file
fd = open(destDir + '/' + name, 'wb')
fd.ad(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 ists(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():
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\\"+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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论