2017-03-01 136 views
-1

我想製作一個PowerShell腳本,我可以使用RMM工具。所以,基本上這個powershell腳本將在本地機器上執行。它需要檢查應用程序的版本是否已安裝,並且至少需要版本號xx。如果未安裝,或版本較少,則會下載可執行文件並以靜默方式安裝它。PowerShell腳本來安裝軟件

我在網上找到了一個可以正常工作的Adobe Reader例子,但它並沒有在手邊做檢查。所以,這個腳本每次運行時都會安裝Adobe Reader。

$tempFolder=$Env:TEMP 

function runProcess ($cmd, $params) { 
$p = new-object System.Diagnostics.Process 
$p.StartInfo = new-object System.Diagnostics.ProcessStartInfo 
$exitcode = $false 
$p.StartInfo.FileName = $cmd 
$p.StartInfo.Arguments = $params 
$p.StartInfo.UseShellExecute = $False 
$p.StartInfo.RedirectStandardError = $True 
$p.StartInfo.RedirectStandardOutput = $True 
$p.StartInfo.WindowStyle = 1; 
$null = $p.Start() 
$p.WaitForExit() 
$output = $p.StandardOutput.ReadToEnd() 
$exitcode = $p.ExitCode 
$p.Dispose() 
$exitcode 
$output 
} 

#download installer 
invoke-webrequest "ftp://ftp.adobe.com/pub/adobe/reader/win/AcrobatDC/1500720033/AcroRdrDC1500720033_en_US.msi" -OutFile "$tempFolder\AcroRdrDC1500720033_en_US.msi" -ErrorAction Stop 

#run installer 
$res = runProcess msiexec "/i $tempFolder\AcroRdrDC1500720033_en_US.msi /qb" 

#check if return code is 0 
if(0 -ne $res[0]){ 
return "Failed to install Adobe Reader: $($res[0]) $($res[1])" 
} 

#download the patch 
invoke-webrequest "ftp://ftp.adobe.com/pub/adobe/reader/win/AcrobatDC/1502320070/AcroRdrDCUpd1502320070.msp" -OutFile "$tempFolder\AcroRdrDCUpd1502320070.msp" -ErrorAction Stop 

#install it 
$res = runProcess msiexec "/p $tempFolder\AcroRdrDCUpd1502320070.msp /qb" 

#check if return code is 0 
if(0 -ne $res[0]){ 
return "Failed to install Adobe Reader DC Patch: $($res[0]) $($res[1])" 
}else{ 
#Attempt to silently disable the auto updater if set in this script 
new-itemproperty "HKLM:\Software\Policies\Adobe\Acrobat Reader\DC\FeatureLockDown" -name bUpdater -value 0 -ErrorAction SilentlyContinue 
} 

我認爲在這個腳本中可能不需要一些東西。它也沒有檢查版本。

在另一個網站上發現了這個,但不知道如何實現它。此外,它看起來並不像它檢查版本號。

function Is-Installed($program) { 

    $x86 = ((Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall") | 
     Where-Object { $_.GetValue("DisplayName") -like "*$program*" }).Length -gt 0; 

    $x64 = ((Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall") | 
     Where-Object { $_.GetValue("DisplayName") -like "*$program*" }).Length -gt 0; 

    return $x86 -or $x64; 
} 

理想情況下,我想在頂部設置參數,以便我可以使用其他可執行文件的模板。例如

$app_name 
$app_version 
$app_url 
$app_filename 
$app_executable 
$app_arguments 

任何幫助將不勝感激。

+0

什麼任何幫助嗎?爲你設計一個交鑰匙解決方案? (這不是本網站的目的。) –

回答

0

我做了一些更多的挖掘,發現了這個帖子:How to check if a program is installed and install it if it is not?

它允許匹配名稱和版本:

$tempdir = Get-Location 
$tempdir = $tempdir.tostring() 
$appName = '*AirParrot*' 
$appVersion = "2.6.8" 
$msiFile = $tempdir+"\microsoft.interopformsredist.msi" 
$msiArgs = "-qb" 

function Get-InstalledApps 
{ 
    if ([IntPtr]::Size -eq 4) { 
     $regpath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' 
    } 
    else { 
     $regpath = @(
      'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' 
      'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' 
     ) 
    } 
    Get-ItemProperty $regpath | .{process{if($_.DisplayName -and $_.UninstallString) { $_ } }} | Select DisplayName, Publisher, InstallDate, DisplayVersion, UninstallString |Sort DisplayName 

} 

$result = Get-InstalledApps | where {$_.DisplayName -like $appName -and $_.DisplayVersion -ge $appVersion} 

If ($result -eq $null) { 
    (Start-Process -FilePath $msiFile -ArgumentList $msiArgs -Wait -Passthru).ExitCode 
} 
+0

我剛剛意識到我的版本並不比較。 –