none
Wie Produktversionen vergleichen? RRS feed

  • Frage

  • Hallo,

    als Powershell Newbie darf ich mich dran versuchen, die Versionsnummern zweier Programme zu vergleichen. Lese ich mit (Get-Command c:\windows\explorer.exe).FileVersionInfo.ProductVersion die Produktversion des Explorers aus, bekomme ich 6.1.7600.16385 als Ergebnis.

    Nun müsste ich aber diese Versionsnummer weiter verarbeiten - genauer gesagt ich müsste überprüfen können, ob eine andere Datei eine aktuellere oder ältere Version ist. Allerdings wird die Produktversion als String zurückgegeben und in einer If Abfrage mit -ge auf "gleich oder aktueller" zu überprüfen klappt nicht.

    Wie macht man das richtig?

    Codeschnipsel, wie ich mir das eigentlich wünschen würde:

    function FileVer([string]$fname)
    {
     return (Get-Command $fname).FileVersionInfo.ProductVersion
    }
    
    function CheckInstall([string]$prgpath, $version)
    {
     return ((Test-Path $prgpath) -and (FileVer($prgpath) -ge $version))
    }
    
    CheckInstall("C:\Windows\Explorer.exe", 6.1.7600.16385)
    
    

    Dienstag, 10. Mai 2011 14:47

Antworten

  • Grundsätzlich war dein Ansatz schon richtig. Aber zum einen ist der Funktionsaufruf unten falsch. Parameter werden ohne Klammern und Komma nacheinander angegeben. Zum anderen geht die Zusammenfassung von logischen Vergleichen und dem Return-Befehl oft in die Hose. Hier ist man mit ein paar Zeilen mehr, eher auf der sicheren Seite und das Debuggen ist deutlich einfacher.

    So sollte es funktionieren: 

    function FileVer([string]$fname)
    {
     return (Get-Command $fname).FileVersionInfo.ProductVersion
    }
    
    function CheckInstall([string]$prgpath, $version)
    {
     $ver = FileVer($prgpath)
     if ((Test-Path $prgpath) -and ($ver -ge $version)){
     write-host "Getestete Datei ($ver) ist neuer oder gleich $version"
     }
     else {
     write-host "Getestete Datei ($ver) ist älter als $version"
     }
    }
    
    CheckInstall "C:\Windows\Explorer.exe" 6.1.7600.16385

    Grüße, Denniver

     

     

     


    http://bytecookie.wordpress.com/
    Dienstag, 10. Mai 2011 23:18
    Moderator

Alle Antworten

  • Grundsätzlich war dein Ansatz schon richtig. Aber zum einen ist der Funktionsaufruf unten falsch. Parameter werden ohne Klammern und Komma nacheinander angegeben. Zum anderen geht die Zusammenfassung von logischen Vergleichen und dem Return-Befehl oft in die Hose. Hier ist man mit ein paar Zeilen mehr, eher auf der sicheren Seite und das Debuggen ist deutlich einfacher.

    So sollte es funktionieren: 

    function FileVer([string]$fname)
    {
     return (Get-Command $fname).FileVersionInfo.ProductVersion
    }
    
    function CheckInstall([string]$prgpath, $version)
    {
     $ver = FileVer($prgpath)
     if ((Test-Path $prgpath) -and ($ver -ge $version)){
     write-host "Getestete Datei ($ver) ist neuer oder gleich $version"
     }
     else {
     write-host "Getestete Datei ($ver) ist älter als $version"
     }
    }
    
    CheckInstall "C:\Windows\Explorer.exe" 6.1.7600.16385

    Grüße, Denniver

     

     

     


    http://bytecookie.wordpress.com/
    Dienstag, 10. Mai 2011 23:18
    Moderator
  • Danke, hat funktioniert.
    Donnerstag, 12. Mai 2011 08:01