Difference between revisions of "Google drive"
(→Google Drive Enterprise) |
(→Google Drive Enterprise) |
||
| Line 172: | Line 172: | ||
'''XML template file''' | '''XML template file''' | ||
| − | Note. The 'Remove' line uses a script I use to work out the MSI uninstall command and then run it. As the command changes for each version of Google Drive a different way of working out the uninstall command is needed. | + | Note. The 'Remove' line uses a script I use to work out the MSI uninstall command and then run it. As the command changes for each version of Google Drive a different way of working out the uninstall command is needed. The contents of wpkg_silent_msi_uninstall.bat and uninstall_value-master.au3 are below. The command "\\%DOMAIN%\netlogon\scripts\autoit3cmd_64.exe" is something I use to run a au3 file and view the output. There's nothing wrong with compiling uninstall_value-master.au3 and replacing '"\\%DOMAIN%\netlogon\scripts\autoit3cmd_64.exe" "\\%DOMAIN%\netlogon\scripts\uninstall\uninstall_value-master.au3"' with the path to the exe file. wpkg_silent_msi_uninstall.bat would then need teaking to not expect 5 variables being passed to it but to expect 4. wpkg_silent_msi_uninstall.bat will need playing with when using a exe. |
<source lang="xml"> | <source lang="xml"> | ||
| Line 200: | Line 200: | ||
</source> | </source> | ||
| − | ''' | + | '''wpkg_silent_msi_uninstall.bat''' |
<pre> | <pre> | ||
| − | # | + | @echo off |
| − | # | + | :start |
| − | + | REM This little batch file requires 6 arguments: | |
| + | REM 1 - the path to autoit3cmd_[64 32].exe.exe. | ||
| + | REM 2 - the path to uninstall_value-master.au3. | ||
| + | REM 3 - the text of the program you want to find the uninstall data for | ||
| + | REM 4 - if you want to search for this text case sesative or not, 0=not. | ||
| + | REM 5 - partial or exact match The output is then passed to 'msiexec /qn' | ||
| + | |||
| + | REM C. Mortimer June 2011 | ||
| + | |||
| + | set autoitcmd_exe=%1 | ||
| + | set uninstall_exe=%2 | ||
| + | set toremove=%3 | ||
| + | set case=%4 | ||
| + | set exact=%5 | ||
| + | set tmpfile=%temp%\.zz.txt | ||
| + | set logfile=wpkg_silent_msi_uninstall | ||
| + | set key= | ||
| + | set domain=mathsdom | ||
| + | set counter_wu=0 | ||
| + | set counter_wu-max=120 | ||
| + | set wait-time_wu=30 | ||
| + | |||
| + | echo. | ||
| + | echo.------------------------ | ||
| + | echo.autoitcmd_exe=%autoitcmd_exe% | ||
| + | echo.uninstall_exe=%uninstall_exe% | ||
| + | echo.toremove=%toremove% | ||
| + | echo.case=%case% | ||
| + | echo.exact=%exact% | ||
| + | echo.------------------------ | ||
| + | echo. | ||
| + | |||
| + | echo.[%date% %time%]: ----------------Script Started---------------- >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: autoitcmd_exe=%autoitcmd_exe% >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: uninstall_exe=%uninstall_exe% >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: %uninstall_exe% has a log file in the [user running %uninstall_exe%]'s temp dir >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: toremove=%toremove% >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: case=%case% >>"%temp%\%logfile%.log" | ||
| + | echo.[%date% %time%]: exact=%exact% >>"%temp%\%logfile%.log" | ||
| + | |||
| + | ::%uninstall_exe% exits with an errorlevel equal to the number of uninstall commands available for a given %toremove%. If there's more than 1 this script doesn't uninstall anything. Only when there's 1 value does msiexec run | ||
| + | "%autoitcmd_exe%" "%uninstall_exe%" %toremove% %case% %exact% > %tmpfile% | ||
| + | set numberofrepl=%errorlevel% | ||
| + | If %numberofrepl% GTR 1 echo.MORE THAN ONE UNINSTALL VALUE (%numberofrepl%)&goto end | ||
| + | For /F "Tokens=*" %%i in ('type %tmpfile%') do Set key=%%i | ||
| + | |||
| + | REM If "%key%"=="" echo.No uninstall command to run, variable KEY is blank, ending&echo.[%date% %time%]: No uninstall command to run, variable KEY is blank, ending >>"%temp%\%logfile%.log"&goto end | ||
| + | echo. | ||
| + | echo.uninstall_cmd='%key%' | ||
| + | echo.[%date% %time%]: uninstall_cmd='%key%' >>"%temp%\%logfile%.log" | ||
| + | echo. | ||
| + | echo.%key%|find /i "{"|find /i "}" | ||
| + | if errorlevel 1 echo.Uninstaller is a program, no msiexec therefor just run '%key%' &echo.[%date% %time%]: Uninstaller is a program, no msiexec therefore just run '%key%' >>"%temp%\%logfile%.log" & START "" /WAIT "%key% /S" &goto end | ||
| + | For /F "Tokens=1" %%j in ('\\%domain%\netlogon\bin\time_now.exe') do set time_now=%%j | ||
| + | echo.Run msiexec /log %TEMP%\%time_now%uninstall.log /qn /x%key% | ||
| + | echo.[%date% %time%]: Run msiexec /log %TEMP%\%time_now%uninstall.log /qn /x%key% >>"%temp%\%logfile%.log" | ||
| + | msiexec /log %SYSTEMDRIVE%\tmp\%time_now%uninstall.log /qn /x%key% | ||
| + | If errorlevel 1 echo.[%date% %time%]: msiexec exited with error 1 >>"%temp%\%logfile%.log"&echo.msiexec exited with error 1&goto end | ||
| + | If errorlevel 0 echo.[%date% %time%]: msiexec exited with error 0 >>"%temp%\%logfile%.log"&echo.msiexec exited with error 0 | ||
| + | REM echo.Run msiexec /qn /x%key% | ||
| + | REM echo.[%date% %time%]: Run msiexec /qn /x%key% >>"%temp%\%logfile%.log" | ||
| + | REM msiexec /qn /x%key% | ||
| + | |||
| + | |||
| + | :end | ||
| + | If exist %tmpfile% del /q %tmpfile% | ||
| + | echo.Finished | ||
| + | echo.[%date% %time%]: ----------------Script Finished---------------- >>"%temp%\%logfile%.log" | ||
| + | echo. >>"%temp%\%logfile%.log" | ||
| + | </pre> | ||
| + | |||
| + | '''uninstall_value-master.au3''' | ||
| + | <pre> | ||
| + | #region ;**** Directives created by AutoIt3Wrapper_GUI **** | ||
| + | #AutoIt3Wrapper_Outfile_x64=uninstall_value.exe | ||
#AutoIt3Wrapper_Change2CUI=y | #AutoIt3Wrapper_Change2CUI=y | ||
| − | # | + | #endregion ;**** Directives created by AutoIt3Wrapper_GUI **** |
| − | + | #include "..\autoit3\include\LogPrint.au3" | |
| − | + | ||
| − | #include | + | |
| − | + | ||
| − | + | ; Script to return back the uninstall command for a supplied program name. Either the exact name as used in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{prog name} | |
| − | $ | + | ; can be given or part of the name. Setting the argument to use exact matching to '1' will only match reg key values exactly, '0' will give partical matching |
| − | + | ; This script exits and sets an errorlevel. The value of the errorlevel equals the number of matching uninstall strings. | |
| − | + | ||
| − | + | ; C. Mortimer April 2011 | |
| − | + | ||
| − | + | ||
| + | $MainLog = EnvGet("temp") & "\" & @ScriptName & ".log" | ||
| + | Dim $searchfor = "", $case, $exact, $uninstallstring, $key_and_uninstallstring, $var, $regread, $numberof = 0 | ||
| + | |||
| + | If Not StringInStr(@AutoItExe, "AutoIt3\autoit3") Then | ||
| + | If $CmdLine[0] < 3 Then | ||
| + | ConsoleWrite("Usage" & @CRLF & @CRLF & "You need to provide three arguments." & @CRLF & @CRLF & _ | ||
| + | "The first is the string you want to search for." & @CRLF & _ | ||
| + | "The second is either '1' = case sensitive search or a '0' = not case sensitive." & @CRLF & _ | ||
| + | "The third is either '1' = exact match or '0', a partial match." & _ | ||
| + | "This script sets an errorlevel equal to the number of matching uninstall values." & _ | ||
| + | @CRLF & @CRLF & "E.g. " & @ScriptName & " mozilla 0" & @CRLF) | ||
Exit | Exit | ||
| + | Else | ||
| + | _logPrint($MainLog, "***************************************************") | ||
| + | _logPrint($MainLog, "----------- " & @ScriptName & " Started -----------") | ||
| + | _logPrint($MainLog, "***************************************************") | ||
| + | _logPrint($MainLog, "total number of arguments = " & $CmdLine[0]) | ||
| + | For $i = 1 To $CmdLine[0] Step 1 | ||
| + | _logPrint($MainLog, "arg" & $i & "= " & $CmdLine[$i]) | ||
| + | Next | ||
| + | For $i = 1 To ($CmdLine[0] - 2) Step 1 | ||
| + | $searchfor = $searchfor & " " & $CmdLine[$i] | ||
| + | Next | ||
| + | Do | ||
| + | If StringLeft($searchfor, 1) = """" Then $searchfor = StringTrimLeft($searchfor, 1) | ||
| + | Until @extended = 0 | ||
| + | Do | ||
| + | If StringRight($searchfor, 1) = """" Then $searchfor = StringTrimRight($searchfor, 1) | ||
| + | Until @extended = 0 | ||
| + | Do | ||
| + | If StringLeft($searchfor, 1) = " " Then $searchfor = StringTrimLeft($searchfor, 1) | ||
| + | Until @extended = 0 | ||
| + | Do | ||
| + | If StringRight($searchfor, 1) = " " Then $searchfor = StringTrimRight($searchfor, 1) | ||
| + | Until @extended = 0 | ||
| + | $case = $CmdLine[$CmdLine[0] - 1] | ||
| + | $exact = $CmdLine[$CmdLine[0]] | ||
EndIf | EndIf | ||
| + | Else | ||
| + | $case = 0 | ||
| + | $exact = 0 | ||
| + | $searchfor = "Java 7 Update ?? (64-bit)" | ||
EndIf | EndIf | ||
| − | + | ;~ If StringInStr ($searchfor, "?") Then $searchfor = StringReplace ($searchfor, "?", "[:alnum:]") | |
| − | $ | + | ;~ ConsoleWrite ("$searchfor = '" & $searchfor & "'" & @CRLF) |
| − | + | _logPrint($MainLog, "$case = '" & $case & "'") | |
| − | + | _logPrint($MainLog, "$exact = '" & $exact & "'") | |
| − | ConsoleWrite($ | + | _logPrint($MainLog, "$searchfor = '" & $searchfor & "'") |
| − | If $ | + | |
| + | $parent_key = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ||
| + | $uninstallstring = "" | ||
| + | $key_and_uninstallstring = "" | ||
| + | $count = 0 | ||
| + | $i_max = 400 | ||
| + | _regfind() | ||
| + | ;~ ConsoleWrite("now check for 64 bit" & @CRLF) | ||
| + | If @OSArch = "X64" Then | ||
| + | _logPrint($MainLog, "@OSArch = " & @OSArch) | ||
| + | $parent_key = "HKLM\SOFTWARE\wow6432node\Microsoft\Windows\CurrentVersion\Uninstall" | ||
| + | _regfind() | ||
| + | EndIf | ||
| + | |||
| + | ConsoleWrite($uninstallstring & @CRLF) | ||
| + | _logPrint($MainLog, "$uninstallstring = " & @CRLF & $uninstallstring) | ||
| + | StringReplace ($uninstallstring, "}", "}") | ||
| + | $numberof = @extended | ||
| + | _logPrint($MainLog, "number of uninstall strings = " & $numberof) | ||
| + | _logPrint($MainLog, "----------- " & @ScriptName & " Finished -----------") | ||
| + | Exit $numberof | ||
| + | |||
| + | ; ======================================================== FUNCTIONS ======================================================== | ||
| + | |||
| + | Func _regfind() | ||
| + | ;~ ConsoleWrite("reg = " & $parent_key & @CRLF) | ||
| + | For $i = 1 To $i_max Step 1 | ||
| + | $var = RegEnumKey($parent_key, $i) | ||
| + | ;~ ConsoleWrite("var = " & $var & ", error = " & @error & ", $i = " & $i & @CRLF) | ||
| + | If $var = "" Then | ||
| + | ;~ ConsoleWrite ("Error reading the reg file, exiting" & @CRLF) | ||
| + | ;~ _logPrint($MainLog, "Error reading the reg file, exiting") | ||
| + | $i = $i_max | ||
| + | Else | ||
| + | If StringInStr(RegRead($parent_key & "\" & $var, "DisplayName"), $searchfor, $case) > 0 Then | ||
| + | ConsoleWrite ("The string '" & $searchfor & "' is in the reg key '" & $parent_key & "\" & $var & "' (" & RegRead($parent_key & "\" & $var, "DisplayName") & ")" & @CRLF) | ||
| + | _logPrint($MainLog, "The string '" & $searchfor & "' is in the reg key '" & $parent_key & "\" & $var & "' (" & RegRead($parent_key & "\" & $var, "DisplayName") & ")") | ||
| + | If $exact = 1 Then | ||
| + | If StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) = StringLen($searchfor) Then | ||
| + | _logPrint($MainLog, "The string length of '" & RegRead($parent_key & "\" & $var, "DisplayName") & "' is the same length as $arg1 '" & $searchfor & "' (" & StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) & " = " & StringLen($searchfor) & ")") | ||
| + | $cont = 1 | ||
| + | _logPrint($MainLog, "$cont = 1") | ||
| + | Else | ||
| + | $cont = 0 | ||
| + | _logPrint($MainLog, "$cont = 0") | ||
| + | EndIf | ||
| + | Else | ||
| + | $cont = 1 | ||
| + | _logPrint($MainLog, "$cont = 1") | ||
| + | EndIf | ||
| + | ;~ ConsoleWrite ("StringLen(" & RegRead($parent_key & "\" & $var, "DisplayName") & ") = " & StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) & @CRLF) | ||
| + | ;~ ConsoleWrite("StringLen(" & $searchfor & ") = " & StringLen($searchfor) & @CRLF) | ||
| + | _logPrint($MainLog, "StringLen(" & RegRead($parent_key & "\" & $var, "DisplayName") & ") = " & StringLen(RegRead($parent_key & "\" & $var, "DisplayName"))) | ||
| + | _logPrint($MainLog, "StringLen $arg1(" & $searchfor & ") = " & StringLen($searchfor)) | ||
| + | If $cont = 1 Then | ||
| + | ;~ ConsoleWrite ($parent_key & "\" & $var & @CRLF) | ||
| + | ;~ ConsoleWrite("regread = '" & RegRead($parent_key & "\" & $var, "DisplayName") & "'" & @CRLF) | ||
| + | If StringLen(RegRead($parent_key & "\" & $var, "QuietUninstallString")) > 0 Then | ||
| + | _logPrint($MainLog, "The stringlength of '" & $parent_key & "\" & $var & " -- QuietUninstallString' is > 0 therefore $regread = '" & RegRead($parent_key & "\" & $var, "QuietUninstallString") & "'") | ||
| + | ;~ ConsoleWrite ("QUIETUNINSTALLSTRING" & @CRLF) | ||
| + | $regread = RegRead($parent_key & "\" & $var, "QuietUninstallString") | ||
| + | ;~ If $case = 1 Then | ||
| + | ;~ If $var = $searchfor Then _uninstalled("quiet") | ||
| + | ;~ Else | ||
| + | ;~ If StringInStr($var, $searchfor) > 0 Then _uninstalled("quiet") | ||
| + | ;~ EndIf | ||
| + | _uninstalled() | ||
| + | ElseIf StringLen(RegRead($parent_key & "\" & $var, "UninstallString")) > 0 Then | ||
| + | _logPrint($MainLog, "The stringlength of '" & $parent_key & "\" & $var & " -- UninstallString' is > 0 therefore $regread = '" & RegRead($parent_key & "\" & $var, "UninstallString") & "'") | ||
| + | ;~ ConsoleWrite ("UNINSTALLSTRING" & @CRLF) | ||
| + | $regread = RegRead($parent_key & "\" & $var, "UninstallString") | ||
| + | ;~ If $case = 1 Then | ||
| + | ;~ If $var = $searchfor Then _uninstalled() | ||
| + | ;~ Else | ||
| + | ;~ ConsoleWrite ("$var = " & $var & @CRLF) | ||
| + | ;~ If StringInStr($var, $searchfor) > 0 Then _uninstalled() | ||
| + | ;~ EndIf | ||
| + | _uninstalled() | ||
| + | EndIf | ||
| + | EndIf | ||
| + | Else | ||
| + | ;~ ConsoleWrite ("nothing" & @CRLF) | ||
| + | EndIf | ||
| + | EndIf | ||
| + | Next | ||
| + | EndFunc ;==>_regfind | ||
| + | |||
| + | Func _uninstalled() | ||
| + | $count = $count + 1 | ||
| + | ;~ ConsoleWrite ("$count = " & $count & @CRLF) | ||
| + | If StringInStr($regread, "msiexec") Then | ||
| + | $open_bracket = StringInStr($regread, "{") | ||
| + | $close_bracket = StringInStr($regread, "}") | ||
| + | $msi_string = StringMid($regread, $open_bracket, $close_bracket - $open_bracket + 1) | ||
| + | ;~ ConsoleWrite("(" & $uorq & " - trimmed) (" & $count & ") (" & $open_bracket & "," & $close_bracket & ") " & $var & " = " & $msi_string & @CRLF) | ||
| + | ;~ ConsoleWrite ("msiexec /x " & $msi_string & @CRLF) | ||
| + | $uninstallstring = $msi_string & @CRLF & $uninstallstring | ||
| + | $key_and_uninstallstring = StringReplace($parent_key, "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "") & "\" & $msi_string & @CRLF & $key_and_uninstallstring | ||
| + | Else | ||
| + | ;~ ConsoleWrite("(" & $uorq & ") (" & $count & ") " & $var & " = " & $regread & @CRLF) | ||
| + | ;~ ConsoleWrite ("$regread = " & $regread & @CRLF) | ||
| + | $uninstallstring = $regread & @CRLF & $uninstallstring | ||
| + | $key_and_uninstallstring = StringReplace($parent_key, "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "") & "\" & $regread & @CRLF & $key_and_uninstallstring | ||
| + | EndIf | ||
| + | _logPrint($MainLog, "$key_and_uninstallstring = '" & $key_and_uninstallstring & "'") | ||
| + | EndFunc ;==>_uninstalled | ||
</pre> | </pre> | ||
[[Category:Silent Installers]] | [[Category:Silent Installers]] | ||
Revision as of 12:56, 4 June 2015
Google Drive Enterprise
To deploy Google Drive, you want to download the file gsync.msi. To get this file you need to know the version of gsync to work out the URL. e.g. version 1.22.9403.223 uses the URL http://dl.google.com/drive/1.22.9403.0223/gsync.msi. Note how the extra '0' has been added to '223'. If you try to use http://dl.google.com/drive/1.22.9403.223/gsync.msi you'll get page not found. This extra '0' is needed to make the last group of numbers up to a length of 4.
New versions of Google Drive are released ever two weeks or so so to save my time I run a task schedule on a PC that runs every day, sees if there's a new msi, downloads it and makes a new WPKG XML file. To do this I run a compiled Autoit script and use a template XML file.
Autoit script. Compile as an exe and run this as a Windows task. It will work out the latest version by reading [1]. It will save the msi into the directory $wpkg_path\[version number]\. The WPKG template is in the dir $wpkg_tree_file - copy of the template below the Autoit code. The template file is copied locally and the string 'VERSION_NUMBER' replaced with the real Google Driver version number. The edited template file is then copied into the live WPKG tree, in my case $wpkg_tree_file.
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=gdrive_downloaded.exe
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Fileversion=0.0.0.26
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <iNetbios.au3>
#include <LogPrint.au3>
#include <File.au3>
;Script to look for the current version of Google Drive, look to see if we've already downloaded it onto the WPKG programs dir. If we haven't, download it and then create an updated WPKG XML file.
;
;C. Mortimer May 2015
$temp_auction_www_download = @TempDir & "\gdrive_info.html"
$get_www_tech_page = "http://www.filehippo.com/download_google_drive/tech/"
$get_www_msi_page = "http://dl.google.com/drive/"
$msi_www_filename = "gsync.msi"
$netbios_domain = "\\" & _GetNetBIOS("samba server")
$wpkg_path = $netbios_domain & "\wpkg7\server\wpkg\programs\cloud\google_drive\"
$logfile = EnvGet("temp") & "\" & @ScriptName & ".log"
$xml_template = @ScriptDir & "\google_drive_template.xml"
$replace_string = "VERSION_NUMBER"
$wpkg_tree_file = $netbios_domain & "\wpkg7\server\WPKG\packages\google_drive.xml"
$temp_copy_2_wpkg_tree = 0
$temp_copy_2_wpkg_tst_tree = 0
_logPrint($logfile, "***************************************************")
_logPrint($logfile, "------------- " & @ScriptName & " v" & FileGetVersion(@ScriptName) & " Started -------------")
_logPrint($logfile, "***************************************************")
_logPrint($logfile, "$temp_auction_www_download = " & $temp_auction_www_download)
_logPrint($logfile, "$get_www_tech_page = " & $get_www_tech_page)
_logPrint($logfile, "$get_www_msi_page = " & $get_www_msi_page)
_logPrint($logfile, "$msi_www_filename = " & $msi_www_filename)
_logPrint($logfile, "$wpkg_path = " & $wpkg_path)
Local $get_gdrive_tech_www = InetGet($get_www_tech_page, $temp_auction_www_download, 1, 1)
Do
Sleep(250)
Until InetGetInfo($get_gdrive_tech_www, 2) ; Check if the download is complete.
Local $aData = InetGetInfo($get_gdrive_tech_www)
InetClose($get_gdrive_tech_www) ; Close the handle to release resourcs.
If $aData[3] = "True" Then
Sleep(500)
$a_downloaded_html = FileReadToArray($temp_auction_www_download) ; create an array containing the download WWW file
;~ _ArrayDisplay ($a_downloaded_html)
$a_opening_indexes = _ArrayFindAll($a_downloaded_html, "<div class=""program-title"" title=""Google Drive ", "", "", 0, 1)
;~ _ArrayDisplay ($a_opening_indexes)
For $y = 0 To UBound($a_opening_indexes) - 1 Step 1
$version_line = StringReplace(StringReplace($a_downloaded_html[$a_opening_indexes[$y]], "<div class=""program-title"" title=""Google Drive ", ""), """>", "")
$version_line = StringReplace($version_line, " ", "")
;~ ConsoleWrite("$version_line = " & $version_line & @CRLF)
$version_line_no_dec = StringReplace($version_line, ".", "")
If StringIsDigit($version_line_no_dec) = 1 Then
ConsoleWrite("latest gdrive = '" & $version_line & "'" & @CRLF)
_logPrint($logfile, "latest gdrive = '" & $version_line & "'")
;now check to see if we have a directory on \\mathsdom\wpkg7 for this version of gdrive
If FileExists($wpkg_path & $version_line & "\gsync.msi") = 0 Then
;sometimes the version number can not be used for the url download if the last two groups of numbers don't have 4 characters per group i.e. 1.22.9403.223 won't work, it needs to be 1.22.9403.0223. We need to check for this
;~ $version_line_www = "1.22.1103.9923"
$version_line_www = $version_line
$version_array = StringSplit($version_line_www, ".")
;~ _ArrayDisplay ($version_array)
If StringLen($version_array[3]) <> 4 Then
Do
$version_array_3 = $version_array[3]
_ArrayInsert($version_array, 3, "0" & $version_array_3)
;~ _ArrayDisplay ($version_array)
_ArrayDelete($version_array, 4)
;~ _ArrayDisplay ($version_array)
Until StringLen($version_array[3]) = 4
EndIf
;~ _ArrayDisplay ($version_array)
;now check the last group of numbers
If StringLen($version_array[4]) <> 4 Then
Do
$version_array_4 = $version_array[4]
_ArrayDelete($version_array, 4)
;~ _ArrayDisplay ($version_array)
_ArrayAdd($version_array, "0" & $version_array_4)
;~ _ArrayDisplay ($version_array)
Until StringLen($version_array[4]) = 4
EndIf
;~ _ArrayDisplay ($version_array)
$version_line_www = _ArrayToString($version_array, ".", 1)
;~ ConsoleWrite("version_line = '" & $version_line & "'")
;~ Exit
If FileExists($wpkg_path & $version_line) = 0 Then
$dir_mk = DirCreate($wpkg_path & $version_line)
ConsoleWrite("$dir_mk = " & $dir_mk & " [1=success]" & @CRLF)
_logPrint($logfile, "$dir_mk = " & $dir_mk & " [1=success]")
Else
ConsoleWrite("The dir '" & $wpkg_path & $version_line & "' already exists" & @CRLF)
_logPrint($logfile, "The dir '" & $wpkg_path & $version_line & "' already exists")
$dir_mk = 1
EndIf
If $dir_mk = 1 Then
Local $get_gdrive_msi = InetGet($get_www_msi_page & $version_line_www & "/" & $msi_www_filename, $wpkg_path & $version_line & "\" & $msi_www_filename, 1, 1)
ConsoleWrite("$get_gdrive_msi = '" & $get_www_msi_page & $version_line_www & "/" & $msi_www_filename & "'" & @CRLF)
_logPrint($logfile, "$get_gdrive_msi = '" & $get_www_msi_page & $version_line_www & "/" & $msi_www_filename & "'")
Do
Sleep(250)
Until InetGetInfo($get_gdrive_msi, 2) ; Check if the download is complete.
Local $aData = InetGetInfo($get_gdrive_msi)
InetClose($get_gdrive_msi) ; Close the handle to release resourcs.
;~ ConsoleWrite (" $aData[3] = " & $aData[3] & @CRLF)
If $aData[3] = "True" Then
If FileExists($wpkg_path & "\latest.lnk") Then FileDelete($wpkg_path & "\latest.lnk")
$crt_shortcut = FileCreateShortcut($wpkg_path & $version_line & "\" & $msi_www_filename, $wpkg_path & "\latest.lnk")
ConsoleWrite("GDrive downloaded to " & $wpkg_path & $version_line & "\" & @CRLF)
_logPrint($logfile, "GDrive downloaded to " & $wpkg_path & $version_line & "\")
ConsoleWrite("Shortcut to the latest google drive created with result '" & $crt_shortcut & "' [1=success]" & @CRLF)
_logPrint($logfile, "Shortcut to the latest google drive created with result '" & $crt_shortcut & "' [1=success]")
;we'll now make a new WPKG xml file
If FileExists($xml_template) Then
$temp_copy = FileCopy($xml_template, $xml_template_tmp, 8)
ConsoleWrite("A copy of the template file " & $xml_template & " to " & $xml_template_tmp & " completed with '" & $temp_copy & "' [1=success]" & @CRLF)
_logPrint($logfile, "A copy of the template file " & $xml_template & " to " & $xml_template_tmp & " completed with '" & $temp_copy & "' [1=success]")
$replace_ver = _ReplaceStringInFile($xml_template_tmp, $replace_string, $version_line, 0, 1)
ConsoleWrite("There were '" & $replace_ver & "' replacements of the string '" & $replace_string & "' with the version value of '" & $version_line & "' [there should be >=1]" & @CRLF)
_logPrint($logfile, "There were '" & $replace_ver & "' replacements of the string '" & $replace_string & "' with the version value of '" & $version_line & "' [there should be >=1]")
$temp_copy_2_wpkg_tree = FileCopy($xml_template_tmp, $wpkg_tree_file, 1)
ConsoleWrite("A copy of the template file " & $xml_template_tmp & " to " & $wpkg_tree_file & " completed with '" & $temp_copy_2_wpkg_tree & "' [1=success]" & @CRLF)
_logPrint($logfile, "A copy of the template file " & $xml_template_tmp & " to " & $wpkg_tree_file & " completed with '" & $temp_copy_2_wpkg_tree & "' [1=success]")
ConsoleWrite($xml_template_tmp & " was deleted with result '" & $del_tmp_file & "' [1=success]" & @CRLF)
_logPrint($logfile, $xml_template_tmp & " was deleted with result '" & $del_tmp_file & "' [1=success]")
Else
ConsoleWrite("The file '" & $xml_template & "' doesn't exist, ending" & @CRLF)
_logPrint($logfile, "The file '" & $xml_template & "' doesn't exist, ending")
EndIf
$y = UBound($a_opening_indexes) - 1
Else
ConsoleWrite("$aData[3] didn't return 'true', it returned '" & $aData[3] & "', download not available? Ending" & @CRLF)
_logPrint($logfile, "$aData[3] didn't return 'true', it returned '" & $aData[3] & "', download not available? Ending")
EndIf
Else
$dir_mk = 1
ConsoleWrite("$dir_mk <> 1 (" & $dir_mk & ") therefore ending" & @CRLF)
_logPrint($logfile, "$dir_mk <> 1 (" & $dir_mk & ") therefore ending")
EndIf
Else
ConsoleWrite($wpkg_path & $version_line & " already exists, no need to download anything" & @CRLF)
_logPrint($logfile, $wpkg_path & $version_line & " already exists, no need to download anything")
EndIf
EndIf
Next
Else
ConsoleWrite("Failed to obtain the latest Google Drive version. What does '" & $get_www_tech_page & "' show?" & @CRLF)
_logPrint($logfile, "Failed to obtain the latest Google Drive version. What does '" & $get_www_tech_page & "' show?")
EndIf
_logPrint($logfile, "***************************************************")
_logPrint($logfile, "")
XML template file Note. The 'Remove' line uses a script I use to work out the MSI uninstall command and then run it. As the command changes for each version of Google Drive a different way of working out the uninstall command is needed. The contents of wpkg_silent_msi_uninstall.bat and uninstall_value-master.au3 are below. The command "\\%DOMAIN%\netlogon\scripts\autoit3cmd_64.exe" is something I use to run a au3 file and view the output. There's nothing wrong with compiling uninstall_value-master.au3 and replacing '"\\%DOMAIN%\netlogon\scripts\autoit3cmd_64.exe" "\\%DOMAIN%\netlogon\scripts\uninstall\uninstall_value-master.au3"' with the path to the exe file. wpkg_silent_msi_uninstall.bat would then need teaking to not expect 5 variables being passed to it but to expect 4. wpkg_silent_msi_uninstall.bat will need playing with when using a exe.
<?xml version="1.0" encoding="UTF-8"?>
<packages>
<package id="googledrive" name="Google Drive" revision="%version%" reboot="false" priority="17">
<variable name="VERSION" value="VERSION_NUMBER" />
<check type="uninstall" condition="versionequalto" path="Google Drive" value="%VERSION%" />
<!--<depends package-id="vc-runtime-2008" /> -->
<install cmd='%COMSPEC% /c "%SOFTWARE%\cloud\google_drive\gdrive_install.bat %VERSION%' />
<install cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Docs.lnk" del /q "%PUBLIC%\desktop\Google Docs.lnk"' />
<install cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Sheets.lnk" del /q "%PUBLIC%\desktop\Google Sheets.lnk"' />
<install cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Slides.lnk" del /q "%PUBLIC%\desktop\Google Slides.lnk"' />
<upgrade cmd='%COMSPEC% /c "%SOFTWARE%\cloud\google_drive\gdrive_install.bat %VERSION%' />
<upgrade cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Docs.lnk" del /q "%PUBLIC%\desktop\Google Docs.lnk"' />
<upgrade cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Sheets.lnk" del /q "%PUBLIC%\desktop\Google Sheets.lnk"' />
<upgrade cmd='%COMSPEC% /c if exist "%PUBLIC%\desktop\Google Slides.lnk" del /q "%PUBLIC%\desktop\Google Slides.lnk"' />
<remove cmd='%COMSPEC% /c if defined ProgramW6432 ("\\%DOMAIN%\netlogon\scripts\uninstall\wpkg_silent_msi_uninstall.bat" "\\%DOMAIN%\netlogon\scripts\autoit3cmd_64.exe" "\\%DOMAIN%\netlogon\scripts\uninstall\uninstall_value-master.au3" "Google Drive" 1 1)' />
</package>
</packages>
wpkg_silent_msi_uninstall.bat
@echo off
:start
REM This little batch file requires 6 arguments:
REM 1 - the path to autoit3cmd_[64 32].exe.exe.
REM 2 - the path to uninstall_value-master.au3.
REM 3 - the text of the program you want to find the uninstall data for
REM 4 - if you want to search for this text case sesative or not, 0=not.
REM 5 - partial or exact match The output is then passed to 'msiexec /qn'
REM C. Mortimer June 2011
set autoitcmd_exe=%1
set uninstall_exe=%2
set toremove=%3
set case=%4
set exact=%5
set tmpfile=%temp%\.zz.txt
set logfile=wpkg_silent_msi_uninstall
set key=
set domain=mathsdom
set counter_wu=0
set counter_wu-max=120
set wait-time_wu=30
echo.
echo.------------------------
echo.autoitcmd_exe=%autoitcmd_exe%
echo.uninstall_exe=%uninstall_exe%
echo.toremove=%toremove%
echo.case=%case%
echo.exact=%exact%
echo.------------------------
echo.
echo.[%date% %time%]: ----------------Script Started---------------- >>"%temp%\%logfile%.log"
echo.[%date% %time%]: autoitcmd_exe=%autoitcmd_exe% >>"%temp%\%logfile%.log"
echo.[%date% %time%]: uninstall_exe=%uninstall_exe% >>"%temp%\%logfile%.log"
echo.[%date% %time%]: %uninstall_exe% has a log file in the [user running %uninstall_exe%]'s temp dir >>"%temp%\%logfile%.log"
echo.[%date% %time%]: toremove=%toremove% >>"%temp%\%logfile%.log"
echo.[%date% %time%]: case=%case% >>"%temp%\%logfile%.log"
echo.[%date% %time%]: exact=%exact% >>"%temp%\%logfile%.log"
::%uninstall_exe% exits with an errorlevel equal to the number of uninstall commands available for a given %toremove%. If there's more than 1 this script doesn't uninstall anything. Only when there's 1 value does msiexec run
"%autoitcmd_exe%" "%uninstall_exe%" %toremove% %case% %exact% > %tmpfile%
set numberofrepl=%errorlevel%
If %numberofrepl% GTR 1 echo.MORE THAN ONE UNINSTALL VALUE (%numberofrepl%)&goto end
For /F "Tokens=*" %%i in ('type %tmpfile%') do Set key=%%i
REM If "%key%"=="" echo.No uninstall command to run, variable KEY is blank, ending&echo.[%date% %time%]: No uninstall command to run, variable KEY is blank, ending >>"%temp%\%logfile%.log"&goto end
echo.
echo.uninstall_cmd='%key%'
echo.[%date% %time%]: uninstall_cmd='%key%' >>"%temp%\%logfile%.log"
echo.
echo.%key%|find /i "{"|find /i "}"
if errorlevel 1 echo.Uninstaller is a program, no msiexec therefor just run '%key%' &echo.[%date% %time%]: Uninstaller is a program, no msiexec therefore just run '%key%' >>"%temp%\%logfile%.log" & START "" /WAIT "%key% /S" &goto end
For /F "Tokens=1" %%j in ('\\%domain%\netlogon\bin\time_now.exe') do set time_now=%%j
echo.Run msiexec /log %TEMP%\%time_now%uninstall.log /qn /x%key%
echo.[%date% %time%]: Run msiexec /log %TEMP%\%time_now%uninstall.log /qn /x%key% >>"%temp%\%logfile%.log"
msiexec /log %SYSTEMDRIVE%\tmp\%time_now%uninstall.log /qn /x%key%
If errorlevel 1 echo.[%date% %time%]: msiexec exited with error 1 >>"%temp%\%logfile%.log"&echo.msiexec exited with error 1&goto end
If errorlevel 0 echo.[%date% %time%]: msiexec exited with error 0 >>"%temp%\%logfile%.log"&echo.msiexec exited with error 0
REM echo.Run msiexec /qn /x%key%
REM echo.[%date% %time%]: Run msiexec /qn /x%key% >>"%temp%\%logfile%.log"
REM msiexec /qn /x%key%
:end
If exist %tmpfile% del /q %tmpfile%
echo.Finished
echo.[%date% %time%]: ----------------Script Finished---------------- >>"%temp%\%logfile%.log"
echo. >>"%temp%\%logfile%.log"
uninstall_value-master.au3
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=uninstall_value.exe
#AutoIt3Wrapper_Change2CUI=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include "..\autoit3\include\LogPrint.au3"
; Script to return back the uninstall command for a supplied program name. Either the exact name as used in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{prog name}
; can be given or part of the name. Setting the argument to use exact matching to '1' will only match reg key values exactly, '0' will give partical matching
; This script exits and sets an errorlevel. The value of the errorlevel equals the number of matching uninstall strings.
; C. Mortimer April 2011
$MainLog = EnvGet("temp") & "\" & @ScriptName & ".log"
Dim $searchfor = "", $case, $exact, $uninstallstring, $key_and_uninstallstring, $var, $regread, $numberof = 0
If Not StringInStr(@AutoItExe, "AutoIt3\autoit3") Then
If $CmdLine[0] < 3 Then
ConsoleWrite("Usage" & @CRLF & @CRLF & "You need to provide three arguments." & @CRLF & @CRLF & _
"The first is the string you want to search for." & @CRLF & _
"The second is either '1' = case sensitive search or a '0' = not case sensitive." & @CRLF & _
"The third is either '1' = exact match or '0', a partial match." & _
"This script sets an errorlevel equal to the number of matching uninstall values." & _
@CRLF & @CRLF & "E.g. " & @ScriptName & " mozilla 0" & @CRLF)
Exit
Else
_logPrint($MainLog, "***************************************************")
_logPrint($MainLog, "----------- " & @ScriptName & " Started -----------")
_logPrint($MainLog, "***************************************************")
_logPrint($MainLog, "total number of arguments = " & $CmdLine[0])
For $i = 1 To $CmdLine[0] Step 1
_logPrint($MainLog, "arg" & $i & "= " & $CmdLine[$i])
Next
For $i = 1 To ($CmdLine[0] - 2) Step 1
$searchfor = $searchfor & " " & $CmdLine[$i]
Next
Do
If StringLeft($searchfor, 1) = """" Then $searchfor = StringTrimLeft($searchfor, 1)
Until @extended = 0
Do
If StringRight($searchfor, 1) = """" Then $searchfor = StringTrimRight($searchfor, 1)
Until @extended = 0
Do
If StringLeft($searchfor, 1) = " " Then $searchfor = StringTrimLeft($searchfor, 1)
Until @extended = 0
Do
If StringRight($searchfor, 1) = " " Then $searchfor = StringTrimRight($searchfor, 1)
Until @extended = 0
$case = $CmdLine[$CmdLine[0] - 1]
$exact = $CmdLine[$CmdLine[0]]
EndIf
Else
$case = 0
$exact = 0
$searchfor = "Java 7 Update ?? (64-bit)"
EndIf
;~ If StringInStr ($searchfor, "?") Then $searchfor = StringReplace ($searchfor, "?", "[:alnum:]")
;~ ConsoleWrite ("$searchfor = '" & $searchfor & "'" & @CRLF)
_logPrint($MainLog, "$case = '" & $case & "'")
_logPrint($MainLog, "$exact = '" & $exact & "'")
_logPrint($MainLog, "$searchfor = '" & $searchfor & "'")
$parent_key = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$uninstallstring = ""
$key_and_uninstallstring = ""
$count = 0
$i_max = 400
_regfind()
;~ ConsoleWrite("now check for 64 bit" & @CRLF)
If @OSArch = "X64" Then
_logPrint($MainLog, "@OSArch = " & @OSArch)
$parent_key = "HKLM\SOFTWARE\wow6432node\Microsoft\Windows\CurrentVersion\Uninstall"
_regfind()
EndIf
ConsoleWrite($uninstallstring & @CRLF)
_logPrint($MainLog, "$uninstallstring = " & @CRLF & $uninstallstring)
StringReplace ($uninstallstring, "}", "}")
$numberof = @extended
_logPrint($MainLog, "number of uninstall strings = " & $numberof)
_logPrint($MainLog, "----------- " & @ScriptName & " Finished -----------")
Exit $numberof
; ======================================================== FUNCTIONS ========================================================
Func _regfind()
;~ ConsoleWrite("reg = " & $parent_key & @CRLF)
For $i = 1 To $i_max Step 1
$var = RegEnumKey($parent_key, $i)
;~ ConsoleWrite("var = " & $var & ", error = " & @error & ", $i = " & $i & @CRLF)
If $var = "" Then
;~ ConsoleWrite ("Error reading the reg file, exiting" & @CRLF)
;~ _logPrint($MainLog, "Error reading the reg file, exiting")
$i = $i_max
Else
If StringInStr(RegRead($parent_key & "\" & $var, "DisplayName"), $searchfor, $case) > 0 Then
ConsoleWrite ("The string '" & $searchfor & "' is in the reg key '" & $parent_key & "\" & $var & "' (" & RegRead($parent_key & "\" & $var, "DisplayName") & ")" & @CRLF)
_logPrint($MainLog, "The string '" & $searchfor & "' is in the reg key '" & $parent_key & "\" & $var & "' (" & RegRead($parent_key & "\" & $var, "DisplayName") & ")")
If $exact = 1 Then
If StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) = StringLen($searchfor) Then
_logPrint($MainLog, "The string length of '" & RegRead($parent_key & "\" & $var, "DisplayName") & "' is the same length as $arg1 '" & $searchfor & "' (" & StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) & " = " & StringLen($searchfor) & ")")
$cont = 1
_logPrint($MainLog, "$cont = 1")
Else
$cont = 0
_logPrint($MainLog, "$cont = 0")
EndIf
Else
$cont = 1
_logPrint($MainLog, "$cont = 1")
EndIf
;~ ConsoleWrite ("StringLen(" & RegRead($parent_key & "\" & $var, "DisplayName") & ") = " & StringLen(RegRead($parent_key & "\" & $var, "DisplayName")) & @CRLF)
;~ ConsoleWrite("StringLen(" & $searchfor & ") = " & StringLen($searchfor) & @CRLF)
_logPrint($MainLog, "StringLen(" & RegRead($parent_key & "\" & $var, "DisplayName") & ") = " & StringLen(RegRead($parent_key & "\" & $var, "DisplayName")))
_logPrint($MainLog, "StringLen $arg1(" & $searchfor & ") = " & StringLen($searchfor))
If $cont = 1 Then
;~ ConsoleWrite ($parent_key & "\" & $var & @CRLF)
;~ ConsoleWrite("regread = '" & RegRead($parent_key & "\" & $var, "DisplayName") & "'" & @CRLF)
If StringLen(RegRead($parent_key & "\" & $var, "QuietUninstallString")) > 0 Then
_logPrint($MainLog, "The stringlength of '" & $parent_key & "\" & $var & " -- QuietUninstallString' is > 0 therefore $regread = '" & RegRead($parent_key & "\" & $var, "QuietUninstallString") & "'")
;~ ConsoleWrite ("QUIETUNINSTALLSTRING" & @CRLF)
$regread = RegRead($parent_key & "\" & $var, "QuietUninstallString")
;~ If $case = 1 Then
;~ If $var = $searchfor Then _uninstalled("quiet")
;~ Else
;~ If StringInStr($var, $searchfor) > 0 Then _uninstalled("quiet")
;~ EndIf
_uninstalled()
ElseIf StringLen(RegRead($parent_key & "\" & $var, "UninstallString")) > 0 Then
_logPrint($MainLog, "The stringlength of '" & $parent_key & "\" & $var & " -- UninstallString' is > 0 therefore $regread = '" & RegRead($parent_key & "\" & $var, "UninstallString") & "'")
;~ ConsoleWrite ("UNINSTALLSTRING" & @CRLF)
$regread = RegRead($parent_key & "\" & $var, "UninstallString")
;~ If $case = 1 Then
;~ If $var = $searchfor Then _uninstalled()
;~ Else
;~ ConsoleWrite ("$var = " & $var & @CRLF)
;~ If StringInStr($var, $searchfor) > 0 Then _uninstalled()
;~ EndIf
_uninstalled()
EndIf
EndIf
Else
;~ ConsoleWrite ("nothing" & @CRLF)
EndIf
EndIf
Next
EndFunc ;==>_regfind
Func _uninstalled()
$count = $count + 1
;~ ConsoleWrite ("$count = " & $count & @CRLF)
If StringInStr($regread, "msiexec") Then
$open_bracket = StringInStr($regread, "{")
$close_bracket = StringInStr($regread, "}")
$msi_string = StringMid($regread, $open_bracket, $close_bracket - $open_bracket + 1)
;~ ConsoleWrite("(" & $uorq & " - trimmed) (" & $count & ") (" & $open_bracket & "," & $close_bracket & ") " & $var & " = " & $msi_string & @CRLF)
;~ ConsoleWrite ("msiexec /x " & $msi_string & @CRLF)
$uninstallstring = $msi_string & @CRLF & $uninstallstring
$key_and_uninstallstring = StringReplace($parent_key, "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "") & "\" & $msi_string & @CRLF & $key_and_uninstallstring
Else
;~ ConsoleWrite("(" & $uorq & ") (" & $count & ") " & $var & " = " & $regread & @CRLF)
;~ ConsoleWrite ("$regread = " & $regread & @CRLF)
$uninstallstring = $regread & @CRLF & $uninstallstring
$key_and_uninstallstring = StringReplace($parent_key, "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "") & "\" & $regread & @CRLF & $key_and_uninstallstring
EndIf
_logPrint($MainLog, "$key_and_uninstallstring = '" & $key_and_uninstallstring & "'")
EndFunc ;==>_uninstalled