`

PowerShell基础教程(19)——处理软件安装

阅读更多

PowerShell基础教程(19)——处理软件安装             <o:p></o:p>

通过 WMI Win32_Product 类可以访问正确设计以使用 Windows Installer 的应用程序但是并非目前使用的所有应用程序都使用 Windows Installer。由于 Windows Installer 为处理可安装的应用程序提供了范围最广的各种标准技术,因此我们将集中讨论这些应用程序。使用备用安装例程的应用程序通常不受 Windows Installer 管理。处理这些应用程序的具体技术将取决于安装程序软件和应用程序开发人员的决定。

<!----><!----><!---->请注意: <o:p></o:p>

对于通过将应用程序文件复制到计算机的方式进行安装的应用程序来说,通常无法使用此处讨论的技术对它们进行管理。可以使用在“处理文件和文件夹”一节中讨论的技术,将这些应用程序作为文件和文件夹进行管理。<o:p></o:p>

列出 Windows Installer 应用程序<o:p></o:p>

使用简单的 WMI 查询,可以很容易地枚举在本地或远程系统上用 Windows Installer 安装的应用程序:

PS> Get-WmiObject -Class Win32_Product -ComputerName .<o:p></o:p>

IdentifyingNumber :{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}<o:p></o:p>

Name              :Microsoft .NET Framework 2.0<o:p></o:p>

Vendor            :Microsoft Corporation<o:p></o:p>

Version           : 2.0.50727<o:p></o:p>

Caption           :Microsoft .NET Framework 2.0<o:p></o:p>

<o:p> </o:p>

由于需要使用默认情况下不显示的其他信息因此您可能仍然需要使用 Select-Object。如果尝试查找 Microsoft .NET Framework 2.0 的软件包缓存位置,则可以使用以下命令:

PS> Get-WmiObject -Class Win32_Product -ComputerName .| Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Select-Object -Property [a-z]*<o:p></o:p>

Name              :Microsoft .NET Framework 2.0<o:p></o:p>

Version           : 2.0.50727<o:p></o:p>

InstallState      : 5<o:p></o:p>

Caption           :Microsoft .NET Framework 2.0<o:p></o:p>

Description       :Microsoft .NET Framework 2.0<o:p></o:p>

IdentifyingNumber :{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}<o:p></o:p>

InstallDate       : 20060506<o:p></o:p>

InstallDate2      : 20060506000000.000000-000<o:p></o:p>

InstallLocation   :<o:p></o:p>

PackageCache      :C:\WINDOWS\Installer\619ab2.msi<o:p></o:p>

SKUNumber         :<o:p></o:p>

Vendor            :Microsoft Corporation<o:p></o:p>

<o:p> </o:p>

另外可以使用 Get-WmiObject Filter 参数以便只选择 Microsoft .NET Framework 2.0。在此命令中使用的筛选器是 WMI 筛选器,因此它不使用 Windows PowerShell 筛选语法,而是使用 WMI 查询语言 (WQL)

Get-WmiObject -Class Win32_Product -ComputerName .-Filter "Name='Microsoft .NET Framework 2.0'"| Select-Object -Property [a-z]*<o:p></o:p>

<o:p> </o:p>

<!----><!----><!---->请注意 <o:p></o:p>

WQL 查询常用的字符例如空格或等于号 Windows PowerShell 中有特殊含义。因此,谨慎的做法是始终将 Filter 参数的值放在一对引号内。还可以使用 Windows PowerShell 转义字符,即倒引号 (`),但它可能不会提高可读性。以下命令相当于前面的命令,并返回相同结果,但是使用倒引号“`”会将特殊字符转义,而不是将整个筛选器字符串放在引号内:<o:p></o:p>

Get-WmiObject -Class Win32_Product -ComputerName .-Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Select-Object -Property [a-z]*<o:p></o:p>

<o:p> </o:p>

生成精简列表的另一种方式是显式地选择显示格式。若要标识已安装的特定软件包,则以下输出中显示的属性最有用:

Get-WmiObject -Class Win32_Product -ComputerName .| Format-List Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber<o:p></o:p>

...<o:p></o:p>

Name              :HighMAT Extension to Microsoft Windows XP CD Writing Wizard<o:p></o:p>

InstallDate       : 20051022<o:p></o:p>

InstallLocation   :C:\Program Files\HighMAT CD Writing Wizard\<o:p></o:p>

PackageCache      :C:\WINDOWS\Installer\113b54.msi<o:p></o:p>

Vendor            :Microsoft Corporation<o:p></o:p>

Version           : 1.1.1905.1<o:p></o:p>

IdentifyingNumber :{FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}<o:p></o:p>

...<o:p></o:p>

<o:p> </o:p>

最后若要仅查找已安装的应用程序的名称一个简单的 Format-Wide 语句即可完成减少输出的工作

Get-WmiObject -Class Win32_Product -ComputerName .| Format-Wide -Column 1<o:p></o:p>

<o:p> </o:p>

尽管现在已有几种方式来查看使用 Windows Installer 完成安装的应用程序但我们尚未考虑其他应用程序。由于大多数标准应用程序会向 Windows 注册它们的卸载程序,因此可以在 Windows 注册表中查找这些程序,以便在本地处理它们。

列出所有可卸载的应用程序<o:p></o:p>

尽管不能保证找到系统中的所有应用程序但可以找到在添加或删除程序对话框中列出的所有程序。“添加或删除程序”将从注册表项 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 下面的列表中查找这些应用程序,并且我们还可以自己检查此项,以查找应用程序。若要使查看 Uninstall 项更容易,可以将 Windows PowerShell 驱动器映射到此注册表位置:

PS> New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall<o:p></o:p>

<o:p> </o:p>

Name       Provider      Root                                   CurrentLocation<o:p></o:p>

----       --------      ----                                   ---------------<o:p></o:p>

Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...<o:p></o:p>

<o:p> </o:p>

<!----><!----><!---->请注意 <o:p></o:p>

HKLM: 驱动器映射到 HKEY_LOCAL_MACHINE 的根因此我们在 Uninstall 项的路径中使用该驱动器。如果不使用 HKLM:则可能使用 HKLM HKEY_LOCAL_MACHINE 指定注册表路径。使用现有注册表驱动器的优点是我们可以使用 Tab 补齐功能来填充项名称,所以不需要键入它们。<o:p></o:p>

<o:p> </o:p>

现在,我们有了一个名为“Uninstall”的驱动器,可以用它来快速和方便地查找应用程序的安装信息。通过统计 Uninstall: Windows PowerShell 驱动器中的注册表项数,可以查找已安装的应用程序个数:

PS> (Get-ChildItem -Path Uninstall:).Length<o:p></o:p>

459<o:p></o:p>

<o:p> </o:p>

可以从 Get-ChildItem 开始使用多种技术进一步搜索此应用程序列表。若要将应用程序列表放到 $UninstallableApplications 变量中,可以执行以下命令:

$UninstallableApplications = Get-ChildItem -Path Uninstall:<o:p></o:p>

<o:p> </o:p>

<!----><!----><!---->请注意 <o:p></o:p>

在此处使用长变量名称是为了清晰起见。在实际使用中,不必使用长名称。可以使用 Tab 补齐功能自动填写变量名称,另外还可以使用 1–2 个字符的名称加快速度。如果正在开发希望重用的代码,则较长的说明性名称最有用。<o:p></o:p>

<o:p> </o:p>

通过使用以下命令可以在 Uninstall 项中找到应用程序的显示名:

PS> Get-ChildItem -Path Uninstall:| ForEach-Object -Process { $_.GetValue("DisplayName") }<o:p></o:p>

<o:p> </o:p>

无法保证这些值是唯一的。在以下示例中两个已安装项都显示为Windows Media Encoder 9 Series”:

PS> Get-ChildItem -Path Uninstall:| Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

Hive:Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros<o:p></o:p>

oft\Windows\CurrentVersion\Uninstall<o:p></o:p>

<o:p> </o:p>

SKC  VC Name                           Property<o:p></o:p>

---  -- ----                           --------<o:p></o:p>

0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...<o:p></o:p>

0  24 {E38C00D0-A68B-4318-A8A6-F7...{AuthorizedCDFPrefix, Comments, Conta...<o:p></o:p>

<o:p> </o:p>

安装应用程序<o:p></o:p>

可以使用 Win32_Product 类在远程或本地安装 Windows Installer 软件包。远程安装时,应当以经典的通用命名约定 (UNC) 网络路径的格式指定要安装的 .msi 软件包的路径,这是因为 WMI 子系统不理解 Windows PowerShell 路径。例如,若要将位于网络共享 \\AppServ\dsp 上的 MSI 软件包 NewPackage.msi 安装到远程计算机 PC01 上,可以在 Windows PowerShell 提示符下输入以下命令:

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).InvokeMethod("Install","\\AppSrv\dsp\NewPackage.msi")<o:p></o:p>

<o:p> </o:p>

不使用 Windows Installer 技术的应用程序可能有特定于应用程序的方法来进行自动部署。若要查找是否有自动部署的方法,可能需要查看应用程序的文档,或咨询应用程序供应商的支持系统。在某些情况下,即使应用程序供应商没有专门将应用程序设计为自动安装,该安装程序软件制造商仍然可能有某些自动化的技术。

删除应用程序<o:p></o:p>

使用 Windows PowerShell 删除 Windows Installer 软件包与使用 InvokeMethod 安装软件包的工作方式大体相同。下面是基于名称属性选择要卸载的软件包的示例;在某些情况下,用 IdentifyingNumber 进行筛选可能更容易:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName .).InvokeMethod("Uninstall",$null)<o:p></o:p>

<o:p> </o:p>

删除其他应用程序并不那么简单甚至在本地这样做时也如此。我们可以通过提取 UninstallString 属性来找到这些应用程序的命令行卸载字符串。此方法对 Windows Installer 应用程序和出现在 Uninstall 项下面的旧程序有效:

Get-ChildItem -Path Uninstall:| ForEach-Object -Process { $_.GetValue("UninstallString") }<o:p></o:p>

<o:p> </o:p>

如果需要可以按显示名筛选输出

Get-ChildItem -Path Uninstall:| Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }<o:p></o:p>

<o:p> </o:p>

但是如果不进行某些修改这些字符串可能无法在 Windows PowerShell 提示符下直接使用。

升级 Windows Installer 应用程序<o:p></o:p>

执行应用程序升级涉及两条信息。您需要知道要升级的已安装应用程序的名称以及应用程序升级软件包的路径。有了该信息,就可以使用单个命令行从 Windows PowerShell 执行升级:

(Get-WmiObject -Class Win32_Product -ComputerName .-Filter "Name='OldAppName'").InvokeMethod("Upgrade","\\AppSrv\dsp\OldAppUpgrade.msi")<o:p></o:p>

 
分享到:
评论

相关推荐

    PowerShell基础教程.doc

    PowerShell的基础教程主要涵盖了它与传统外壳程序的区别、Cmdlet的使用、全新的脚本语言特性和与Windows命令及实用工具的集成。 1. **处理方式的不同**: PowerShell 不像传统的Cmd.exe或其他Unix外壳程序那样处理...

    Windows PowerShell教程合集

    --|PowerShell基础教程 --|WindowsPowerShelluserGuide |powershell 中文教程 --|Windows PowerShell 入门指南.pdf --|Windows PowerShell 入门.pdf --|Windows PowerShell 语言快速参考.rtf |Manning.Windows....

    PowerShell基础教程

    【PowerShell基础教程】 PowerShell是一种专为管理和自动化Windows操作系统设计的强大脚本语言,自Windows XP/Server 2003起,它逐渐成为Vista、Server 2008及后续版本的标准组件。PowerShell旨在提升系统管理员的...

    经典PowerShell入门教程.docx

    传统外壳程序如Cmd.exe、SH、KSH、CSH和BASH通常以文本格式处理命令输出,而PowerShell则处理基于.NET平台的对象,这使得数据处理更为灵活和强大。 PowerShell的核心概念之一是Cmdlet(发音为“command-let”),...

    PowerShell 基础教程

    【PowerShell基础教程】 PowerShell是一种强大的脚本语言和命令行shell,主要应用于Windows操作系统,如XP、Server 2003、Vista和Server 2008。不同于传统的外壳程序(如Cmd.exe、SH、KSH、CSH和BASH),PowerShell...

    PowerShell教程

    **PowerShell教程** PowerShell是微软开发的一种命令行外壳程序和脚本环境,主要用于系统管理和自动化任务执行。它集成了传统的命令行工具和.NET Framework的功能,提供了更强大的控制和脚本编写能力。作为一门面向...

    powershell教程

    ### PowerShell 教程详解 #### 一、PowerShell 概述与重要性 PowerShell 是一个强大的命令行脚本环境,由微软开发并提供支持,主要用于 Windows 系统的管理和自动化任务处理。自 Exchange Server 2007 和 System ...

    PowerShell 入门基础教程

    现在win2008,win7都集成了PowerShell,系统不带PowerShell可以自行到官方下载安装即可。 下载地址://www.jb51.net/jiaoben/67200.html 解读: 1、什么是交互式提示? 答:交互式提示就像打开一个cmd窗口,在里面...

    Powershell 实例教程

    对于Windows 8.1和Windows Server 2012 R2,系统默认已安装PowerShell 4.0。 在PowerShell控制台上,用户可以自定义设置,如在“属性”对话框中调整选项、字体、布局和颜色。例如,"选项"选项卡允许用户配置光标...

    powershell 教程

    PowerShell 3.0进阶教程中提到的服务器管理主要围绕以下几个方面: 1. 启用多服务器管理:在Windows Server 2012中,管理员可以启用远程管理功能,从而可以在本地或远程管理服务器。启用远程管理的基本步骤包括打开...

    Windows PowerShell 实用教程

    ### Windows PowerShell 实用教程 #### Windows PowerShell 概览 Windows PowerShell 是由微软开发的一款强大的交互式命令行界面和脚本语言环境,专为系统管理和自动化设计。它首次出现在 Windows XP 和 Windows ...

    监控局域网内 共享打印机powershell脚本

    监控局域网内:共享打印机 获取打印记录、打印人员、打印文件等详细信息。导出为excel表格

    Win7PowerShell使用教程

    Win7PowerShell使用教程,学习这个脚本还是有好处的,看看吧

    19.Powershell基础入门及常见用法(一)1

    【Powershell基础入门及常见用法】 Powershell是一种强大的命令行接口和脚本语言,主要用于管理和自动化Microsoft操作系统及应用程序。在网络安全领域,Powershell因其灵活性和深度集成而备受青睐,是Web安全专家...

    Powershell教程

    非常好用的Powershell教程,共享给大家

    powershell3.0经典教程

    根据提供的文件信息,以下是对标题和描述中所提到知识点的详细说明: Windows PowerShell 3.0 是一个由微软...上述内容构成了PowerShell 3.0教程的基础,适合初学者逐步学习,并为后续更深层次的应用打下坚实的基础。

    powershell中英文教程

    1. **PowerShell基础知识** PowerShell基于.NET Framework,提供了比传统的Cmd.exe更丰富的对象模型和命令集。在PowerShell中,每个命令(称为cmdlet)都有一个固定的参数模式,遵循统一的命名规则,如`Get-Item`, ...

    企业软件批量安装(静默安装、CMD安装、PowerShell安装)工具、企业PC批量管理工具

    这是一套适合企业Windows桌面运维人员、网络管理员、系统管理员、网络技术员及服务器运维人员等必备的管理维护神器,适合在域控环境下的Windows管理,能够为Windows域客户端批量提供软件安装、策略部署、脚本运行及...

Global site tag (gtag.js) - Google Analytics