65.9K
CodeProject 正在变化。 阅读更多。
Home

通过PowerShell自动安装/更新Chromium浏览器

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年7月19日

CPOL

9分钟阅读

viewsIcon

38440

downloadIcon

236

一个 PowerShell 脚本,可在 Windows 中自动安装和更新您的 Chromium 浏览器

我为什么在这里?

  • 如果您喜欢使用开源的 Chromium 浏览器而不是更具专有性质的 Google Chrome
  • 如果您不喜欢每次都手动更新 Chromium
  • 如果您喜欢从 zip 压缩包而不是安装程序更新 Chromium
  • 如果您好奇 PowerShell 今天还能为您做些什么))

介绍  

对于那些还不熟悉 Chromium 浏览器的读者,让我快速介绍一下。

Chromium 项目 是一个完全开源的努力,由 Google 和广泛的社区支持,旨在为 Google 的专有 Google Chrome 浏览器构建基础。

基本上,它是这样运作的。Chromium 项目不断发布更新。然后 Google 获取这些更新,测试它们的稳定性,进行完善,并添加一些专有代码,例如内置的 PDF 阅读器、各种媒体格式支持和自动更新程序。

因此,那些不希望 Google 收集任何信息,或偏爱完全开源软件,或只是渴望始终拥有最新、最好、最快版本浏览器的人们,会使用 Chromium 而不是 Chrome

在我使用 Chromium 的这段时间里,我发现唯一特别令人恼火的是总是需要手动更新它。这更令人沮丧,因为我更喜欢从 zip 压缩包而不是安装程序进行更新(安装程序还会清除您的用户配置文件)。此外,我不想对 Windows 进行任何更改(除了它创建的用户配置文件),但又想控制程序在硬盘上的位置。

涉及的步骤实在太多了,令人恼火:

  1. 打开 Chromium 构建下载 列表
  2. 关闭任何打开的 Chromium 实例
  3. 打开最新构建(最新版本)目录
  4. 点击 'chrome-win32.zip' 下载浏览器压缩包
  5. 在电脑上,删除旧 Chromium 版本目录
  6. 解压 'chrome-win32.zip' 内容
  7. 删除源 'chrome-win32.zip'
所以我迫切需要将这个过程限制到只需一次点击,于是我的探索开始了!

背景 

如果您已经熟悉 PowerShell 基础知识并且您的系统已准备好运行 PowerShell 脚本(.ps1 文件),那将很有帮助;如果还没有,您可以在此处遵循简单说明

如果您对 PowerShell 一无所知,但了解一些 VisualBasicC#,您也一样会没问题的!

让我们来看看一些 PowerShell!

我将逐步介绍这个脚本正在做什么(您也可以在本文末尾下载完整的脚本)。

如果您想在阅读本文时尝试这段代码,最好的方法是使用 Windows PowerShell ISE,它是一个不错的脚本构建 GUI,与 PowerShell 捆绑在一起。在 Windows 7/8 上,您可以通过“开始”菜单搜索找到它,而在 Windows XP 上,它应该位于类似于以下目录中:C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe

它具有漂亮的选项卡界面和代码高亮显示功能,并允许您立即查看 PowerShell 输出。让我们将第一个空的打开选项卡保存为 Chromium_Updater.ps1(或您选择的名称)。

步骤 1:配置更新设置

这是您需要配置您的系统特有设置的部分。您可以将本地设置直接存储在脚本文件中作为变量,但最好将它们放在某个外部配置文件中,这样您的主脚本文件就可以在不同系统上重复使用而无需修改。

那么,存储这些设置最简单的方法是什么?在 PowerShell 的世界里,最可靠的选择是 XMLXMLPowerShell 的一等公民,因此您只需编写最少的代码即可处理 XML 文件。

$xml_document = [xml](get-content Some_XML_File.xml) 

那一行代码将您的 XML 文件内容加载到内存中。如果您的 XML 文件类似于这样

<settings>
  <property>Value</property>
</settings>  

要获取该属性值 'Value':

$property_value = $xml_document.settings.property 

记住这一点,让我们在与 Chromium_Updater.ps1 相同的文件夹中创建一个名为 Chromium_Updater_Settings.xml 的文件:

<settings type="Chromium_Updater_Settings">
  <archive_name>chrome-win32</archive_name>
  <archive_ext>.zip</archive_ext>
  <download_path></download_path>
  <install_path>C:\Programs</install_path>
</settings> 

这里 archive_name 'chrome-win32' 是 Google 提供的压缩 Chromium 归档文件的默认名称,也是该归档文件内唯一文件夹的名称,因此无论其内容解压到何处,Chromium 都将位于 'chrome-win32' 文件夹中。而 archive_ext 不言自明。然后 download_path 是归档文件将从 Google 服务器下载的路径(暂时不要设置)。最后,install_pathchrome-win32.zip 的内容应该解压到的位置。

现在让我们回到空的 Chromium_Updater.ps1 脚本,并从我们刚刚创建的 XML 文件中加载设置:

$config = [xml](get-content Chromium_Updater_Settings.xml -ErrorAction SilentlyContinue) 

注意到 -ErrorAction SilentlyContinue 了吗?它的作用是,如果 XML 文件不存在或损坏,它会隐藏任何错误,这意味着 $config 将变为 null,这样我们就可以检查 XML 文件是否已加载:

if ($config -eq $null) { 
  ""; "Chromium_Updater_Settings.xml file is not found!"
  Start-Sleep -s 5; exit 
}  

这个验证基本上检查我们的局部变量 $config 是否为 null,如果是,则显示错误消息,等待 5 秒,然后停止脚本。

如果此验证通过,我们现在可以将其设置加载到局部变量中

$chromium_archive_name = $config.settings.archive_name
$chromium_archive_ext  = $config.settings.archive_ext
$install_path = $config.settings.install_path + "\"
 
$download_path = $env:USERPROFILE + "\"
if ($config.settings.download_path) { 
  $download_path = $config.settings.download_path 
}    

这里非常直接,除了 $download_path。这里发生的情况是——默认情况下 PowerShell 通过 $env:USERPROFILE 调用将其路径设置为默认用户目录。如果您在 XML 文件中设置了自定义位置,它将用您的自定义值替换默认值。

现在我们拥有了在本地计算机上更新/安装 Chromium 所需的所有信息。但是让我们再添加两个用于内部的有用变量

$source_archive_path = $download_path + $chromium_archive_name + $chromium_archive_ext
$old_version_path = $install_path + $chromium_archive_name 

由于我们将简单地将 Chromium 压缩包的内容解压到选定的文件夹中,所以 $old_version_path 将包含源压缩包内文件夹的名称,在本例中是 chrome-win32

现在,让我们进入下一步。

步骤 2:下载最新 Chromium 构建的压缩包

获取最新的 Chromium 构建是一个两步过程。第一步是找出最新的构建号。Google 提供了一个 URL,正好可以做到这一点:

http://commondatastorage.googleapis.com/chromium-browser-continuous/Win/LAST_CHANGE

尝试在浏览器中运行它,并打开它的源代码。它只是一个纯粹的6位数字,这正是我们需要的。现在,要下载特定的 Chromium 构建,我们需要使用另一个 URL,我们只需将 [BUILD_NUMBER] 替换为我们从第一个 URL 获得的数字:

http://commondatastorage.googleapis.com/chromium-browser-continuous/Win/[BUILD_NUMBER]/chrome-win32.zip

知道了这些,我们来编写一些 PowerShell 代码来检查并下载最新的 Chromium 构建。我们将使用 .NET System.Web.Client 类的实例来与网络交互:

$web = New-Object System.Net.WebClient
$latest_version = $web.DownloadString("http://commondatastorage.googleapis.com/chromium-browser-continuous/Win/LAST_CHANGE")
if ($latest_version) {
  $url = "http://commondatastorage.googleapis.com/chromium-browser-continuous/Win/" + $latest_version + "/chrome-win32.zip"
  $web.DownloadFile($url, $source_archive_path);
} 

上面的代码片段很简单——它将最新的构建号加载到变量中,检查该数字是否不为 null,然后将 Chromium 压缩包下载到我们之前设置的路径(默认是用户的家目录)。

这一步就到此为止。

步骤 3:安全关闭所有打开的 Chromium 实例

现在我们有了最新的归档文件和所有数据来安装/更新旧版本。但是如果 Chromium 已经打开,我们执行更新会怎样?它会失败,因为所有 Chromium 本地文件都将被占用。为了避免这种情况,我们首先需要轻轻地关闭它,这样 Chromium 就能顺利关闭,而不会损坏任何东西。幸运的是,有一个简单的命令可以做到这一点

Get-Process chrome | % { $_.CloseMainWindow() }

由于 Chromium 为每个打开的标签页或后台进程都有一个单独的进程,我们需要关闭它们全部。上面的命令获取系统中所有名为 chrome 的运行进程列表,然后对于其中的每一个,它会尝试以用户关闭程序窗口或在应用程序内选择“exit”的方式关闭它们。

很快我意识到这样做并不总能达到你的目的,特别是当你打开了很多标签页,或者有一些网站需要一些时间才能关闭时。但是如果你多次运行上面的命令,你肯定能让所有 Chromium 进程都服从你的意愿。这样做:

$attempts = 10
do {
  Get-Process chrome | % { $_.CloseMainWindow() | out-null }
  Start-Sleep -s 1
  $attempts = $attempts - 1
}
until ((Get-Process chrome -ErrorAction SilentlyContinue) -eq $null -Or $attempts -eq 0)

这个 DO UNTIL 循环的工作原理如下:PowerShell 尝试关闭所有 Chromium 进程 > 等待一秒 > 通过 Get-Process 命令检查是否没有 Chromium 进程在运行 > 如果仍有一些进程打开,它会重复尝试,直到所有进程都关闭,或者达到尝试次数限制(在本例中是 10 次尝试或 10 秒)。

至于在 .CloseMainWindow() 之后添加的 ' | out-null' - 它只是隐藏了该命令产生的任何输出。

此外,这可能会让你感到惊讶,但 ChromiumGoogle Chrome 进程的名称是相同的))所以运行 Chromium 更新脚本也会关闭你的 Chrome,当然,如果你碰巧同时运行 ChromeChromium 的话。

这一步我们已经完成了!让我们继续下一步。

步骤 4:移除旧版 Chromium

现在我们已经完全准备好进行更新——我们有最新版本的zip文件,我们知道要安装在哪里,并且我们已经关闭了所有打开的 Chromium 窗口。

我们首先检查 Chromium 是否存在于安装位置,并删除旧版本:

if (Test-Path $old_version_path) {
  Remove-Item -Recurse -Force $old_version_path
}

相当简单,对吧?接下来,让我们检查一下我们设在 XML 文件中的安装目录(路径)是否存在,如果不存在,我们就用 PowerShellNew-Item 命令创建它

if ((Test-Path $install_path) -eq $false) {
  New-Item $install_path -type directory
}

上述检查只在首次运行此脚本时相关——即安装新 Chromium 时。

让我们继续下一步。

步骤 5:提取新版 Chromium

现在让我们解压我们之前下载的 'chrome-win32.zip' 压缩包。不幸的是,PowerShell 没有内置的 zip 文件处理方法。然而 Windows 有!所以我们将使用它来静默解压我们的 zip 文件。代码如下:

$zip_file_path = $source_archive_path
$unzip_path = $install_path
    
if (Test-Path $zip_file_path) { 
  [System.Int32]$yestoall = "16"
  [System.Int32]$progressbar = "4"
  $shellApplication = New-Object -com shell.application 
  $zipPackage = $shellApplication.NameSpace($zip_file_path) 
  $destinationFolder = $shellApplication.NameSpace($unzip_path) 
  $destinationFolder.CopyHere($zipPackage.Items(), $progressbar) 
}

在这段代码中,$yestoall = "16" 表示不需要用户进行任何交互,而 $progressbar = "4" 则隐藏了进度窗口(通常在执行此代码时会弹出)。

现在我们几乎完成了,让我们进入最后一步。

步骤 6:创建桌面快捷方式

是的,为了让它更简单,让我们通过为我们的安装创建一个简单的桌面快捷方式,来避免点击多个文件夹启动 Chromium

$wshshell = New-Object -ComObject WScript.Shell
$lnk = $wshshell.CreateShortcut("$env:USERPROFILE\Desktop\Chromium.lnk")
$lnk.TargetPath = "$old_version_path\chrome.exe"
$lnk.WorkingDirectory = "$old_version_path"
$lnk.Save() 

我们再次需要借助 Windows,因为 PowerShell 没有内置的创建快捷方式的方法。

我们完成了——我们的 Chromium-Updater 脚本已经准备就绪!

回顾

让我们回顾一下我们在这个脚本中实现的过程:

  1. 从 XML 文件加载本地设置
  2. 下载最新的 Chromium 构建版本
  3. 如果 Chromium 已打开,所有实例都会安全关闭
  4. 旧版 Chromium 被移除
  5. 最新 Chromium 构建从 zip 压缩包中提取
  6. 创建 Chromium 的桌面快捷方式

还要记住,在更新/安装过程中,此脚本不需要用户进行任何输入,因此它易于使用,并且非常适合按计划运行,这样您就可以永远不用再手动更新 Chromium 了!

下载

最终脚本包含了上述所有代码片段,但额外地用漂亮的 IF 语句包装起来,并加入了防错逻辑和智能更新进度消息。

当然你可以

以便始终获取最新内容!

未来计划

  • 在控制台内显示下载/zip解压进度
  • 添加选择下载构建号的选项
  • 在 Chromium 的连续(稳定)和快照构建之间进行选择
  • 添加 Chromium 卸载脚本

历史

  • 2012年7月19日 - 初始文章与 Chromium-Updater v.1.0 同时发布
© . All rights reserved.