透過 WMI 的 Win32_Product 類別可存取已妥善設計成使用 Windows Installer 的應用程式,但當今市面上的應用程式並非全都使用 Windows Installer。由於 Windows Installer 提供多種標準技術用於處理可安裝的應用程式,接下來的討論焦點主要著重在這些應用程式。採用其他安裝程式的應用程式通常不是由 Windows Installer 所管理。處理這類應用程式的技巧取決於應用程式開發人員所設計的安裝程式軟體與制定的決策。

附註:

以複製應用程式檔案到電腦的方式所安裝的應用程式通常無法運用此處討論的技巧進行管理。您可將這些應用程式視同檔案和資料夾,運用<處理檔案與資料夾>一節討論的技巧來管理。

列舉 Windows Installer 應用程式

使用簡單的 WMI 查詢即可列舉由 Windows Installer 安裝到本機或遠端系統的應用程式:

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

若要在顯示畫面中顯示 Win32_Product 物件的所有屬性,請使用格式化 Cmdlet (例如 Format-List Cmdlet) 的 Properties 參數並搭配 * (全部) 的值。

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

或者,您也可以使用 Get-WmiObject Filter 參數僅選取 Microsoft .NET Framework 2.0。因為下列命令所使用的篩選器是 WMI 篩選器,所以採用的是 WMI 查詢語言 (WQL) 語法 (而非 Windows PowerShell 語法):

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

請注意,WQL 查詢經常使用空格或等號之類的字元,而這些字元在 Windows PowerShell 中具有特殊意義。因此,請記得一律用引號含括 Filter 參數的值。您也可以使用 Windows PowerShell 逸出字元 (倒引號 `),但這可能會降低可讀性。下列命令等同於上一個命令且傳回相同結果,但卻使用倒引號逸出特殊字元,而不是將整個篩選字串置於引號中:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

如果只要列出您感興趣的屬性,請使用格式化 Cmdlet 的 Property 參數,列出所要的屬性。

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

最後,如果只要找出已安裝應用程式的名稱,則可利用簡單的 Format-Wide 陳述式簡化輸出:

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

至今雖已介紹多種方法列舉由 Windows Installer 進行安裝的應用程式,卻仍未曾討論到其他應用程式。由於大多數一般應用程式都會向 Windows 登錄其解除安裝程式,您可以在本機 Windows 登錄中找到它們。

列舉所有可解除安裝的應用程式

雖然沒有任何方法能保證找出系統上的每一個應用程式,您仍可從 [新增或移除程式] 對話方塊列示的清單中找到所有的程式。[新增或移除程式] 可在下列登錄機碼找到這些應用程式:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

檢查這個機碼也可以找到應用程式。為了更方便檢視 Uninstall 機碼,您可以將 Windows PowerShell 磁碟機對應到該登錄位置:

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
附註:

HKLM: 磁碟機對應到 HKEY_LOCAL_MACHINE 的根位置,所以 Uninstall 機碼的路徑使用了該磁碟機。您原本可用 HKLMHKEY_LOCAL_MACHINE 指定登錄路徑,而不用 HKLM:。使用現有登錄磁碟機的好處是可利用 Tab 鍵完成機碼名稱,因而省去輸入的麻煩。

如今已經有了 "Uninstall" 這個磁碟機,您就可以用來快速查詢應用程式安裝。只要查詢 Windows PowerShell 磁碟機 Uninstall: 中的登錄機碼數目,即可得知已安裝的應用程式數目:

PS> (Get-ChildItem -Path Uninstall:).Count
459

接著您可運用各種技巧進一步搜尋應用程式清單,例如使用 Get-ChildItem。若要取得應用程式清單,並將其儲存在 $UninstallableApplications 變數中,請使用下列命令:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
附註:

此處使用這麼長的變數名稱是要表明變數的涵義。實際上沒有必要使用長名稱。雖然您可以利用 Tab 鍵完成變數名稱,使用 1 到 2 個字元的名稱更能加速輸入。在開發可供重複使用的程式碼時最適合使用描述性的長名稱。

若要顯示 Uninstall 之下登錄機碼中的登錄項目值,請使用登錄機碼的 GetValue 方法。該方法的值是登錄項目的名稱。

例如,若要在 Uninstall 機碼中找出應用程式的顯示名稱,請使用下列命令:

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

顯示名稱值不保證具有唯一性。以下範例搜尋 "Windows Media Encoder 9 Series" 後找到兩個已安裝項目:

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


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

安裝應用程式

使用 Win32_Product 類別可將 Windows Installer 封裝安裝到本機或遠端系統。進行遠端安裝時,請使用通用命名慣例 (UNC) 網路路徑來指定的 .msi 封裝所在路徑,因為 WMI 子系統無法識別 Windows PowerShell 路徑。例如,若要在遠端電腦 PC01 上安裝網路共用 \\AppServ\dsp 中的 NewPackage.msi 封裝,就應該在 Windows PowerShell 提示字元輸入下列命令:

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

應用程式若不是採用 Windows Installer 技術,可能會提供應用程式專用的自動部署方法。如需判斷是否有自動部署方法,您或許應查閱應用程式的說明文件,或洽詢應用程式廠商的支援部門。在某些情況下,即使應用程式廠商並未特別設計應用程式的自動安裝方法,安裝程式軟體製造商大概也會提供若干自動化技術。

移除應用程式

使用 Windows PowerShell 移除 Windows Installer 封裝的做法與安裝封裝大致相同。以下範例依據名稱屬性選取所要解除安裝的封裝;在某些情況下,依 IdentifyingNumber 進行篩選可能更方便:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

要移除其他應用程式可就沒有這麼簡單,甚至本機也一樣。若要找出這些應用程式的命令列解除安裝字串,您可以擷取 UninstallString 屬性。此方法適用於 Windows Installer 應用程式以及 Uninstall 機碼底下的舊型程式:

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

如有需要,您還能依據顯示名稱篩選輸出:

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

不過,這些字串可能必須修改一下才能直接在 Windows PowerShell 提示內使用。

升級 Windows Installer 應用程式

若要升級應用程式,您必須知道應用程式的名稱,以及應用程式升級封裝的路徑。有了這些資訊之後,即可以單一的 Windows PowerShell 命令升級應用程式:

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




目錄