Powershell脚本将Java更新到最新版本

时间:2014-10-28 14:51:46

标签: java powershell scripting sccm

我们有一个依赖于Java的应用程序,我们正在使用SCCM安装程序来推送到客户端。

由于Java几乎每月更新一次(旧的更新在此后30天到期),我们正在寻找一种方法让SCCM安装程序保持最新的Java版本更新。我们能够从SCCM安装程序运行Powershell脚本,但是我们还没有找到一种方法来编写一个自动下载和安装最新Java版本的脚本。

有谁知道这是否可能,以及我们如何才能解决这个问题?

提前致谢!!

3 个答案:

答案 0 :(得分:2)

请查看this下载PowerShell文件和this安装java silent。 例如:

Invoke-WebRequest $address -OutFile $destination
# $addressis the http-address of the installer
# $destination is a Path where the the downloadoutput should saved to
$destination /s
# with the '/s' Parameter you are starting the installer silent

如果您可以获得下载链接,您应该能够下载并安装java。但是我不知道你怎么能得到这个链接。 我希望这有点帮助。

答案 1 :(得分:1)

您可以使用此页面上提供的链接进行下载:http://java.com/en/download/manual.jsp

或者,您可以进行一次下载并将其放在文件共享上,这样您就可以使用简单的方法从UNC路径复制文件,如

\\fileserver\folder\installerpackage.exe

为头痛做好准备。我自己已经处理了在几十台机器上删除和升级Java的问题,我可以告诉你它并不总是一个干净的卸载/重新安装。除非他们改进了卸载程序,否则很有可能最终会遇到Java安装程序认为已安装的情况,但事实并非如此。我也看到了相反的地方,它认为它没有安装,但确实如此。

答案 2 :(得分:0)

首先,您需要获取最新的下载链接(32位)。

$JavaFile = [pscustomobject]@{
    JavaVersion = ''
    FileName = ''
    DownloadURL =  $((Invoke-WebRequest 'http://www.java.com/en/download/manual.jsp').links | where innerHTML -like "Windows Offline" | select href).href
} 

对于64位URL使用:

$JavaFile = [pscustomobject]@{
    JavaVersion = ''
    FileName = ''
    DownloadURL =  $((Invoke-WebRequest 'http://www.java.com/en/download/manual.jsp').links | where innerHTML -like "Windows Offline (64-bit)" | select href).href
} 

现在我们要检查是否已经下载了该文件。 我们可以通过检查日志文件来完成此操作。因此,首先创建一个javahistorylog.log来存储使用过的链接。 使用以下函数,我们可以检查日志中的链接。

function CheckHistory ($fileurl,$path){
    $history=Get-Content "$path"
    $r = $false
    Foreach ($historicurl in $history){
        if ($historicurl -eq $fileurl){
            $r = $true
        }
    }
    return $r
}

如果找不到,我们可以继续下载文件。

$JavaFile.FileName = "tempinstaller$(get-date -Format yyMMddmm).exe"
Invoke-WebRequest $JavaFile.DownloadURL -OutFile ("$TempDownloadLocation\"+ $JavaFile.FileName) -ev $DLErr
if($DLErr){Exit}

下载后,我们可以对setup.exe进行一些编辑 首先获取版本并保护名称。

$TempFileName = $JavaFile.FileName
$JavaFile.JavaVersion = get-item ("$TempDownloadLocation\"+ $JavaFile.FileName) | select -ExpandProperty versioninfo | select -ExpandProperty productversion

第二次设置并从原始文件名prop。生成名称。

$JavaFile.FileName = "jre1."+(((Select-String -Pattern '[0-9]u[0-9]+' -InputObject (get-item ("$TempDownloadLocation\$TempFileName")   | select -ExpandProperty versioninfo | select -ExpandProperty originalfilename)) |
ForEach-Object -Process {
  $_.Matches
} |
ForEach-Object -Process {
  $_.Value
}) -replace 'u', '.0_')

现在重命名文件。

Rename-Item -Path "$TempDownloadLocation\$TempFileName" -NewName ($JavaFile.FileName+".exe")

更新历史记录

if(Test-Path -path ("$TempDownloadLocation\"+$JavaFile.FileName+".exe")){
    add-content "$TempDownloadLocation\javahistorylog.log" $JavaFile.DownloadURL
}

现在我们可以考虑获取用于构建sw包的MSI文件。

MSI将位于:

$MsiFilePathTemp = "$env:LOCALAPPDATA\Oracle\Java\" -replace 'Local', 'LocalLow'

我们可以通过执行设置并处理msi来获取MSI:

Start-Process -FilePath ("$TempDownloadLocation\"+$JavaFile.FileName+".exe") -ArgumentList '/s'
while(!(Test-Path ("$MsiFilePathTemp\"+$JavaFile.FileName+"\"+$JavaFile.FileName+".msi")))
{
  Start-Sleep -Seconds 1.5
}
Copy-Item -Path ("$MsiFilePathTemp\"+$JavaFile.FileName+"\"+$JavaFile.FileName+".msi") -Destination $MsiFilePathOut -Force -ErrorVariable $CDR
if($CDR){
    exit
}

现在停止进程并删除.exe文件

Get-Process -Name $JavaFile.FileName | Stop-Process
While (Get-Process -Name $JavaFile.FileName -ErrorAction SilentlyContinue)
{
  Start-Sleep -Seconds 2
}
Remove-Item -Path ("$TempDownloadLocation\"+$JavaFile.FileName+".exe") -Force
$MSIFile = ("$MsiFilePathOut\"+$JavaFile.FileName+".msi")

现在你有$MSIFile这是你可以用来构建SCCM包的msi的路径。