2012-01-05 5 views
10

हमारे एंड डिलिवरेबल में MSI फाइलें हैं।PowerShell का उपयोग करके एमएसआई उत्पाद संस्करण संख्या कैसे प्राप्त करूं?

मैं यह सुनिश्चित करता हूं कि उनके पास सही उत्पाद का नाम और उत्पाद संस्करण है या नहीं।

मैं Orca का उपयोग कर रहा हूं और इसे मैन्युअल रूप से कर रहा हूं।

PowerShell का उपयोग करके इसे कैसे करें?

उत्तर

23

यह चाहिए की एक आसान जवाब दिया गया ... Windows इंस्टालर के साथ शुरू करने के लिए है एक COM object आप का उपयोग कर सकते हैं:

ProgID: WindowsInstaller.Installer

लेकिन जब आप के साथ के बाहर एक वस्तु बनाने

:-(

$object = New-Object -Com WindowsInstaller.Installer 
$object | gm 

... कुछ भी नहीं है: PowerShell आप गुण या किसी भी विधि का नहीं मिलता 210

स्पष्ट रूप से यह PowerShell और इसके प्रकार अनुकूलन प्रणाली के साथ एक समस्या है। इस ब्लॉग पोस्ट को आसपास के काम के लिए देखें।

http://www.snowland.se/2010/02/21/read-msi-information-with-powershell/

आप VBScript का उपयोग करते हैं तो आप इस समस्या नहीं होनी चाहिए।

संपादित करें:

यहाँ कुछ VBScript है कि संस्करण मैं found मिल जाएगा:

Const msiOpenDatabaseModeReadOnly = 0 
Dim msi, db, view 

Set msi = CreateObject("WindowsInstaller.Installer") 
Set db = msi.OpenDataBase("C:\Users\andy\Desktop\Module.msi", msiOpenDatabaseModeReadOnly) 
Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'") 
Call view.Execute() 

GetVersion = view.Fetch().StringData(1) 
Wscript.Echo GetVersion 

आप PowerShell से कॉल कर सकते हैं:

$version = & cscript.exe /nologo GetVersion.vbs 

अद्यतन! इस प्रकार की अनुकूलन समस्या मुझे निराशाजनक थी और मैं वीबीएस समाधान से खुश नहीं था। कुछ शोध के बाद मुझे PowerShell में ऐसा करने का एक तरीका मिला। मैंने कोड को blog entry से अनुकूलित किया। का आनंद लें!

function Get-MsiDatabaseVersion { 
    param (
     [IO.FileInfo] $FilePath 
    ) 

    try { 
     $windowsInstaller = New-Object -com WindowsInstaller.Installer 

     $database = $windowsInstaller.GetType().InvokeMember(
       "OpenDatabase", "InvokeMethod", $Null, 
       $windowsInstaller, @($FilePath.FullName, 0) 
      ) 

     $q = "SELECT Value FROM Property WHERE Property = 'ProductVersion'" 
     $View = $database.GetType().InvokeMember(
       "OpenView", "InvokeMethod", $Null, $database, ($q) 
      ) 

     $View.GetType().InvokeMember("Execute", "InvokeMethod", $Null, $View, $Null) 

     $record = $View.GetType().InvokeMember(
       "Fetch", "InvokeMethod", $Null, $View, $Null 
      ) 

     $productVersion = $record.GetType().InvokeMember(
       "StringData", "GetProperty", $Null, $record, 1 
      ) 

     $View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null) 

     return $productVersion 

    } catch { 
     throw "Failed to get MSI file version the error was: {0}." -f $_ 
    } 
} 

Get-MsiDatabaseVersion "C:\Installer.msi" 
+0

धन्यवाद, मैं हटा दिया यह आपकी जानकारी के आधार पर है। – JNK

+0

मेरे लिए काम नहीं करता है, मुझे एक त्रुटि मिलती है: "InvokeMethod" को "3" तर्क के साथ अपवाद: "5" तर्क के साथ अपवाद कॉल "InvokeMember": "OpenDatabase, DatabasePath, OpenMode" " – LeBleu

+0

कोड में 'स्मार्ट कोट्स' शामिल हैं, जो कुछ लोगों को पकड़ा हो सकता है, आपको @LeBleu में त्रुटि दिखाई देगी, मैंने कोड स्निपेट अपडेट किया है। –

2

(क्षमा करें, सिर्फ स्वीकार किए जाते हैं जवाब देने के लिए एक टिप्पणी जोड़ने के प्रतिनिधि नहीं है)

@davidmartin से जवाब मेरे लिए सुपर मददगार था।

केवल बिट मैं जोड़ने के लिए आवश्यक संस्करण अन्यथा एक हैंडल MSI और बाद में उपयोग पर खुला रखा असफल हो सकता है लौटने से पहले वस्तु को बंद करने गया था: मेरा उत्तर पर टिप्पणी के लिए

$View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null) 

return $productVersion 
संबंधित मुद्दे