windows 下利用vbs进行程序的自动安装

        上上篇说了一下linux平台下程序的自动安装,利用的是shell脚本,而同理在windows平台上,利用的则是vbs,当然单纯的vbs并不是很强大,同时我还利用了cmd的一些命令。同上一篇一样,都是利用ftp进行下载文件,然后在解压,在执行程序,同时会判断指定的端口是否被占用,以及一些业务逻辑处理。详见代码:

ftpIp="10.22.2.21"
ftpPort=2121
agentIp="10.22.2.13"
ftpUserName="test"
ftpUserPwd="123456"
ftpAgentPath="/main/v1.0"
ftpAgentFileName="hyperagent.zip"
ftpJrePath="/java/windows/x86"
ftpJreName="jre.zip"
ftpErrorPath="/error"
agentSaveDir="E:\agentworkhome\dalp"
agentContextName="agent"
installAgentScriptPathName="agentscript"
installAgentScriptFileName="installAgent.vbs"
startAgentScriptName="bin\install.bat"
uninstallAgentScriptName="bin\uninstall.bat"
tempPortFileName="tempPortFileName.txt"
agentPort=4850


Function FTPUpload(sSite, sUsername, sPassword, sLocalFile, sRemotePath)

  Const OpenAsDefault = -2
  Const FailIfNotExist = 0
  Const ForReading = 1
  Const ForWriting = 2

  Set oFTPScriptFSO = CreateObject("Scripting.FileSystemObject")
  Set oFTPScriptShell = CreateObject("WScript.Shell")

  sRemotePath = Trim(sRemotePath)
  sLocalFile = Trim(sLocalFile)

  If InStr(sRemotePath, " ") > 0 Then
    If Left(sRemotePath, 1) <> """" And Right(sRemotePath, 1) <> """" Then
      sRemotePath = """" & sRemotePath & """"
    End If
  End If

  If InStr(sLocalFile, " ") > 0 Then
    If Left(sLocalFile, 1) <> """" And Right(sLocalFile, 1) <> """" Then
      sLocalFile = """" & sLocalFile & """"
    End If
  End If

  If Len(sRemotePath) = 0 Then
    sRemotePath = "\"
  End If

  If InStr(sLocalFile, "*") Then
    If InStr(sLocalFile, " ") Then
      FTPUpload = "Error: Wildcard uploads do not work if the path contains a " & _
      "space." & vbCRLF
      FTPUpload = FTPUpload & "This is a limitation of the Microsoft FTP client."
      Exit Function
    End If
  ElseIf Len(sLocalFile) = 0 or Not oFTPScriptFSO.FileExists(sLocalFile) Then
    FTPUpload = "Error: File Not Found."
    Exit Function
  End If
  '--------END Path Checks---------
  sFTPScript = sFTPScript & "OPEN " & sSite & " " & ftpPort  & vbCRLF
  sFTPScript = sFTPScript & "USER " & sUsername & vbCRLF
  sFTPScript = sFTPScript & sPassword & vbCRLF
  sFTPScript = sFTPScript & "cd " & sRemotePath & vbCRLF
  sFTPScript = sFTPScript & "binary" & vbCRLF
  sFTPScript = sFTPScript & "prompt n" & vbCRLF
  sFTPScript = sFTPScript & "put " & sLocalFile & vbCRLF
  sFTPScript = sFTPScript & "quit" & vbCRLF & "quit" & vbCRLF & "quit" & vbCRLF

  sFTPTemp = oFTPScriptShell.ExpandEnvironmentStrings("%TEMP%")
  sFTPTempFile = sFTPTemp & "\" & oFTPScriptFSO.GetTempName
  sFTPResults = sFTPTemp & "\" & oFTPScriptFSO.GetTempName

  'Write the input file for the ftp commandto a temporary file.
  Set fFTPScript = oFTPScriptFSO.CreateTextFile(sFTPTempFile, True)
  fFTPScript.WriteLine(sFTPScript)
  fFTPScript.Close
  Set fFTPScript = Nothing 

  oFTPScriptShell.Run "%comspec% /c FTP -n -s:" & sFTPTempFile & " "  & " > " & sFTPResults, 0, TRUE
  Wscript.Sleep 1000

  'Check results of transfer.
  Set fFTPResults = oFTPScriptFSO.OpenTextFile(sFTPResults, ForReading, _
  FailIfNotExist, OpenAsDefault)
  sResults = fFTPResults.ReadAll
  fFTPResults.Close

  oFTPScriptFSO.DeleteFile(sFTPTempFile)
  oFTPScriptFSO.DeleteFile (sFTPResults)

  If InStr(sResults, "226 Transfer complete.") > 0 Then
    FTPUpload = True
  ElseIf InStr(sResults, "File not found") > 0 Then
    FTPUpload = "Error: File Not Found"
  ElseIf InStr(sResults, "password incorrect") > 0 Then
    FTPUpload = "Error: Login Failed."
  Else
    FTPUpload = "Error: Unknown."
  End If

  Set oFTPScriptFSO = Nothing
  Set oFTPScriptShell = Nothing
End Function

Function FTPDownload(sSite, sUsername, sPassword, sLocalPath, sRemotePath, sRemoteFile)
  Const OpenAsDefault = -2
  Const FailIfNotExist = 0
  Const ForReading = 1
  Const ForWriting = 2

  Set oFTPScriptFSO = CreateObject("Scripting.FileSystemObject")
  Set oFTPScriptShell = CreateObject("WScript.Shell")

  sRemotePath = Trim(sRemotePath)
  sLocalPath = Trim(sLocalPath)

  '----------Path Checks---------
  If InStr(sRemotePath, " ") > 0 Then
    If Left(sRemotePath, 1) <> """" And Right(sRemotePath, 1) <> """" Then
      sRemotePath = """" & sRemotePath & """"
    End If
  End If

  If Len(sRemotePath) = 0 Then
    sRemotePath = "\"
  End If

  'If the local path was blank. Pass the current working direcory.
  If Len(sLocalPath) = 0 Then
    sLocalpath = oFTPScriptShell.CurrentDirectory
  End If

  If Not oFTPScriptFSO.FolderExists(sLocalPath) Then
    'destination not found
    FTPDownload = "Error: Local Folder Not Found."
    Exit Function
  End If

  sOriginalWorkingDirectory = oFTPScriptShell.CurrentDirectory
  oFTPScriptShell.CurrentDirectory = sLocalPath
  '--------END Path Checks---------

  'build input file for ftp command
  sFTPScript = sFTPScript & "OPEN " & sSite & " " & ftpPort  & vbCRLF
  sFTPScript = sFTPScript & "USER " & sUsername & vbCRLF
  sFTPScript = sFTPScript & sPassword & vbCRLF
  sFTPScript = sFTPScript & "cd " & sRemotePath & vbCRLF
  sFTPScript = sFTPScript & "binary" & vbCRLF
  sFTPScript = sFTPScript & "prompt n" & vbCRLF
  sFTPScript = sFTPScript & "mget " & sRemoteFile & vbCRLF
  sFTPScript = sFTPScript & "quit" & vbCRLF & "quit" & vbCRLF & "quit" & vbCRLF
'msgbox sFTPScript
  sFTPTemp = oFTPScriptShell.ExpandEnvironmentStrings("%TEMP%")
  sFTPTempFile = sFTPTemp & "\" & oFTPScriptFSO.GetTempName
  sFTPResults = sFTPTemp & "\" & oFTPScriptFSO.GetTempName

  'Write the input file for the ftp command to a temporary file.
  Set fFTPScript = oFTPScriptFSO.CreateTextFile(sFTPTempFile, True)
  fFTPScript.WriteLine(sFTPScript)
  fFTPScript.Close
  Set fFTPScript = Nothing 
'msgbox sFTPTempFile
  oFTPScriptShell.Run "%comspec% /c FTP -n -s:" & sFTPTempFile & " "  & _
  " > " & sFTPResults, 0, TRUE

  Wscript.Sleep 1000

  'Check results of transfer.
  Set fFTPResults = oFTPScriptFSO.OpenTextFile(sFTPResults, ForReading, _
                    FailIfNotExist, OpenAsDefault)
  sResults = fFTPResults.ReadAll
  fFTPResults.Close
'	msgbox "sResults:" & sResults
  If InStr(sResults, "226 Transfer complete.") > 0 Then
    FTPDownload = True
  ElseIf InStr(sResults, "File not found") > 0 Then
    FTPDownload = "Error: File Not Found"
  ElseIf InStr(sResults, "password incorrect") > 0 Then
    FTPDownload = "Error: Login Failed."
  Else
    FTPDownload = "Error: Unknown."
  End If

  Set oFTPScriptFSO = Nothing
  Set oFTPScriptShell = Nothing
End Function

'get the name of sourcefile
Function getDefMD5File(sourceFile)
	
	getDefMD5File =sourceFile & ".md5"
	
End Function

Function checkFileExist(filePath)
	Dim Objectfs
	Set Objectfs = CreateObject("Scripting.FileSystemObject")
	If Objectfs.FileExists(filePath) 	Then
	checkFileExist = True	
	Else
	checkFileExist = False	
	End If
End Function


'only read first line
Function readFile(sourceFile)
	Const ForReading = 1, ForWriting = 2   
	Dim fso, f
	On Error Resume Next	
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set f = fso.OpenTextFile(sourceFile, ForReading)
	readFile = f.ReadLine

	if Err.number<>0 then 		
		Wscript.Echo  Err.Number 	& Err.description 			 
		Err.clear 
		readFile=""
	end if 
End Function

Function GetFileHash(file_name)
        Dim file_hash
        Dim hash_value
        Dim i

		Set wi = CreateObject("WindowsInstaller.Installer")

        Set file_hash = wi.FileHash(file_name, 0)

        hash_value = ""

        For i = 1 To file_hash.FieldCount
                hash_value = hash_value & BigEndianHex(file_hash.IntegerData(i))
        Next

        GetFileHash = hash_value

        Set file_hash = Nothing
		Set wi = Nothing
End Function

Function BigEndianHex(int)
        Dim result
        Dim b1, b2, b3, b4

        result = Hex(int)
        b1 = Mid(result, 7, 2)
        b2 = Mid(result, 5, 2)
        b3 = Mid(result, 3, 2)
        b4 = Mid(result, 1, 2)

        BigEndianHex = b1 & b2 & b3 & b4
End Function


Function MD5Check(sourceFile)
	Dim retval,file_hash,server_hash
	retval= FTPDownload(ftpIp, ftpUserName , ftpUserPwd, agentSaveDir, ftpAgentPath,getDefMD5File(sourceFile))

	If retval = true Then
		Wscript.Echo "download " & getDefMD5File(sourceFile) & " success"

		Wscript.Sleep 1000
		
		file_hash = GetFileHash(sourceFile)
		server_hash = readFile(getDefMD5File(sourceFile))
		Wscript.Echo "current md5:" & file_hash
		Wscript.Echo "download md5:" & server_hash

		If InStr(server_hash, file_hash) > 0 Then
			Wscript.Echo "md5 check success file:" & sourceFile
			MD5Check=True
			
		Else
			Wscript.Echo "md5 check fail file:" & sourceFile
		End If 

	

	Else
		Wscript.Echo "download " & getDefMD5File(sourceFile) & " fail " & retval
		'msgbox "update error:" & retval
	End if


End Function

Function deleteFile(sourceFile)

	set fso=createobject("scripting.filesystemobject")
	On Error Resume Next
	fso.deleteFile sourceFile
End Function

Function deleteDirectory(sourceDirectory)
	set fso=createobject("scripting.filesystemobject")
	On Error Resume Next
	fso.deletefolder  sourceDirectory
End Function

Function deleteDirectoryBat(sourceDirectory)
	set objShell=wscript.createObject("wscript.shell")
	'iReturn=objShell.Run("cmd.exe /C unzip -d D:\test\agent_install D:\test\agent_install\dir2.zip", 0, TRUE)
	deleteDirectoryBat=objShell.Run("cmd.exe /C del /s /q " & sourceDirectory , 0, TRUE)
	deleteDirectoryBat=objShell.Run("cmd.exe /C rd /s /q  " & sourceDirectory , 0, TRUE)
End Function

Function downloadFile(sourceFile)
	Dim retval,checkResult

	retval= FTPDownload(ftpIp, ftpUserName , ftpUserPwd, agentSaveDir, ftpAgentPath,sourceFile)
	
	If retval = true Then
		
		checkResult = MD5Check(sourceFile)
		If checkResult = True Then
			Wscript.Echo "md5check success" & ftpAgentFileName
			
		 Else
			Wscript.Echo "md5check fail" & ftpAgentFileName & retval
		End If
		downloadFile = checkResult
		
	Else
		Wscript.Echo "downloadFile error:" & ftpAgentFileName & retval
		downloadFile = false
	End If
	
End Function

Function unzipFile(sourcefile,destPath)
 '   Wscript.Echo "unzipFile " 
	' Wscript.Echo "cmd.exe /C unzip -d " & destPath & " " & sourcefile	
	set objShell=wscript.createObject("wscript.shell")
	'iReturn=objShell.Run("cmd.exe /C unzip -d D:\test\agent_install D:\test\agent_install\dir2.zip", 0, TRUE)
	unzipFile=objShell.Run("cmd.exe /C unzip -d " & destPath & " "  & sourcefile , 0, TRUE)
	'Wscript.Echo "unzipFile " & sourcefile & unzipFile
End Function

Function checkPortIsInUser(port)

	Dim retval ,command,tempPortFullName,portLine
	tempPortFullName = agentSaveDir & "\" & installAgentScriptPathName & "\" & tempPortFileName
	set objShell=wscript.createObject("wscript.shell")
	command ="netstat -ano -p TCP | findstr /i " &  chr(34) & "^TCP [0-9]:" & port & "[^0-9]" &  chr(34) & " > " & tempPortFullName
	Wscript.Echo "run command" & command
	retval=objShell.Run("cmd.exe /C  " & command , 0, TRUE)
	Wscript.Sleep 1000
	retval=checkFileExist(tempPortFullName)
	If retval = true Then
		portLine =  readFile(tempPortFullName)
		If InStr( portLine,port) > 0 Then
			Wscript.Echo "port busy"
			checkPortIsInUser = True			
		Else
			Wscript.Echo "port free"
			checkPortIsInUser = False			
		End If 
	Else
		checkPortIsInUser = False	
	End If

End Function

Function uploadAgentlog(msg)
	Dim retval ,tempLogFullName,fs,f
	tempLogFullName = agentSaveDir & "\" & installAgentScriptPathName & "\" & agentIp & ".log"
	set fs =createobject("scripting.filesystemobject")
	set f=fs.opentextfile(tempLogFullName,2, true)	
	f.write msg
	f.close

	retval = FTPUpload(ftpIp, ftpUserName , ftpUserPwd,tempLogFullName,ftpErrorPath)
End Function

Function uninstallAgent()
	Dim retval ,uninstallScriptFullName
	uninstallScriptFullName =  agentSaveDir & "\" & agentContextName & "\" & uninstallAgentScriptName
	
	retval=checkFileExist(uninstallScriptFullName)
	If retval = true Then
		set objShell=wscript.createObject("wscript.shell")	
		Wscript.Echo "begin uninstall  " & uninstallScriptFullName
		retval=objShell.Run("cmd.exe /C  " & uninstallScriptFullName , 0, TRUE)
		Wscript.Echo "end uninstall  " & uninstallScriptFullName & " " & retval	
	End If
End Function


Function installAgent()
	On Error Resume Next
	Dim retval
	retval =checkPortIsInUser(agentPort)
	If retval = true Then		
		uninstallAgent()
		Wscript.Sleep 3000
		retval =checkPortIsInUser(agentPort)
		If retval = true Then
			'upload log
			uploadAgentlog("port " & agentPort & " busy and cannot be removed,stop install agent")		
		Else
			installAgent2()
		End If
	Else
		installAgent2()
	End If	

End Function

Function installAgent2()
	Dim retval , agentPath,downloadTempPath,startScriptFullName
	On Error Resume Next

	'1 first delete hyperagent directory and zipfile
	'2 then download the hyperagent.zip and jre.zip
	'3 then unzip hyperagent.zip and jre.zip to related path
	'4 invoke the start script of agent 
	'5 upload the log file
	
	'1
	downloadTempPath = agentSaveDir & "\" & installAgentScriptPathName
	agentPath =  agentSaveDir & "\" & agentContextName
	startScriptFullName= agentPath & "\" & startAgentScriptName

    Wscript.Echo "begin delete file " & downloadTempPath & "\" & ftpAgentFileName
	retval=deleteFile(downloadTempPath & "\" & ftpAgentFileName)
	Wscript.Echo "end delete file "& downloadTempPath & "\" & ftpAgentFileName & " " & retval

	Wscript.Echo "begin delete file " & downloadTempPath & "\" & ftpJreName
	retval=deleteFile(downloadTempPath & "\" & ftpJreName)
	 Wscript.Echo "end delete file "& downloadTempPath & "\" & ftpJreName & " " & retval
	Wscript.Sleep 1000

	
    Wscript.Echo "begin delete directory " & agentPath
	retval=deleteDirectoryBat(agentPath)
	 Wscript.Echo "end delete directory " & agentPath & " " & retval
	Wscript.Sleep 1000
	'2	
	Wscript.Echo "begin download  " & ftpAgentFileName
	retval= FTPDownload(ftpIp, ftpUserName , ftpUserPwd, downloadTempPath , ftpAgentPath,ftpAgentFileName)
	Wscript.Echo "end download  " & ftpAgentFileName & " " & retval
	Wscript.Sleep 1000

	Wscript.Echo "begin download  " & ftpJreName
	retval= FTPDownload(ftpIp, ftpUserName , ftpUserPwd, downloadTempPath , ftpJrePath,ftpJreName)
	Wscript.Echo "end download  " & ftpJreName & " " & retval
	Wscript.Sleep 1000
	'3
	Wscript.Echo "begin unzip  " & ftpAgentFileName
	retval=unzipFile(downloadTempPath & "\" & ftpAgentFileName ,agentSaveDir)
	Wscript.Echo "end unzip  " & ftpAgentFileName & " " & retval
	Wscript.Sleep 1000

	Wscript.Echo "begin unzip  " & ftpJreName
	retval=unzipFile(downloadTempPath & "\" & ftpJreName ,agentPath)
	Wscript.Echo "end unzip  " & ftpJreName & " " & retval
	Wscript.Sleep 1000

	'4	
	set objShell=wscript.createObject("wscript.shell")	
	Wscript.Echo "begin start  " & startScriptFullName
	retval=objShell.Run("cmd.exe /C  " & startScriptFullName , 0, TRUE)
	Wscript.Echo "end start  " & startScriptFullName & " " & retval
	
	'5			
	if Err.number<>0 then 		
		Wscript.Echo  Err.Number 	& Err.description 			 
		Err.clear 
		uploadAgentlog("install script error  " &  Err.Number & Err.description & " ,stop install")
	Else
		Wscript.Sleep 3000	
		retval =checkPortIsInUser(agentPort)
		If retval = true Then
			Wscript.Echo	"agent start success on port  " & agentPort 
		Else
			uploadAgentlog("agent installed but start error on port" & agentPort)
		End If
	end if 

End Function

Function updateAgent()
	Dim retval,i

	Wscript.Sleep 4000
	Call deleteFile(ftpAgentFileName)
	Wscript.Sleep 3000


	i=1
	do While i<=3 and Not retval
	Wscript.Echo i
		retval= downloadFile(ftpAgentFileName)
		i=i+1
	Loop	
	If retval = true Then	
		 
		'msgbox "begin start jar file"
		'Wscript.Sleep 1000
		'CreateObject("WScript.Shell").Run "java -cp testagent.jar com.boco.agent.test.Main" ,vbhide
		'set ws = createobject("wscript.shell") 
		'ws.run "cmd /c java -cp testagent.jar com.boco.agent.test.Main" ,vbhide
		'msgbox "end start jar file"
		Wscript.Echo "agent update success"
	Else
		Wscript.Echo "update error:" & retval
		'msgbox "update error:" & retval
	End if

End Function


'Call uploadAgentlog("hello baby bdgfd")
Call installAgent()
'Call checkPortIsInUser(21)
'Call unzipFile("D:\test\agent_install\dir2.zip" ,"D:\test\agent_install")
'unzipFile "D:\test\agent_install" "D:\test\agent_install\dir2.zip" 
'agentPath =  agentSaveDir & "\" & agentContextName 
 '   Wscript.Echo "begin delete directory " & agentPath
'Call deleteDirectoryBat(agentPath)
'myline =checkPortIsInUser(22)
'myline = readFile("d:\test3\nn.txt")

'Wscript.Echo "myline:" & myline
'If InStr( myline,21) > 0 Then
'	Wscript.Echo "port in user"			
'Else
'	Wscript.Echo "port not in user"
'End If 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值