woraxor
Goto Top

Verschachtelte IF Abfrage Powershell

Hallo Zusammen,

habe ein Programm, das es in verschiedenen Versionen gibt...

4.5.0
4.5.3
4.6.2
4.6.3

Das Programm soll überall auf 4.6.3 hochgepached werden.
Nun möchte ich eine Fallabfrage mit IF machen, also wenn 4.5.0. installiert ist, starte install.exe 4.5.3, wenn 4.5.3 installiert ist Starte 4.6.2 usw..
Die version wird über eine .ini Datei herausgelesen und in eine .txt geschrieben.
Habe folgenden Skript bisher gebastelt:

IF($TxtFile=4.5.0) {Start-Process "C:\update-v4.5.0-v4.5.3.exe"}
elseif($TxtFile = 4.5.3) {Start-Process "C:\update-v4.5.3-v4.6.2.exe"}
elseif($TxtFile = 4.6.2) {Start-Process "C:\update-v4.6.2-v4.6.3.exe"}
else {Write-Host "Update-Finish"}

Der Skript zeigt mir kein Fehler...aber starten tut er auch nix face-confused

Bitte um Hilfe

Vielen Dank face-smile

VG

Hanuta

Content-Key: 289109

Url: https://administrator.de/contentid/289109

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: 114757
Lösung 114757 23.11.2015, aktualisiert am 28.12.2015 um 21:44:26 Uhr
Goto Top
Moin,
kein Wunder das Gleichheitszeichen ist kein Vergleichsoperator in Powershell sondern ein Zuweisungsoperator ..., dafür gibt es -eq , -ne usw.
about_Comparison_Operators

Übersichtlicher gehts so:
$version ='4.5.0'  
$mapping = @{
'4.5.0' = 'C:\update-v4.5.0-v4.5.3.exe'  
'4.5.3' = 'C:\update-v4.5.3-v4.6.2.exe'  
'4.6.2' = 'C:\update-v4.6.2-v4.6.3.exe'  
}
if ($mapping[$version]){
    start-process -FilePath $mapping[$version] -wait
}else{
   write-host "Keine bekannte Version" -ForeGroundColor Yellow  
}

Gruß jodel32
Mitglied: Woraxor
Woraxor 23.11.2015 um 13:52:07 Uhr
Goto Top
Hallo und danke für die schnelle Antwort face-smile

das Skript funktioniert super mit einem Festen Laufwerksbuchstaben face-smile

Gibt es auch eine Möglichkeit, wenn das alles auf einem USB-Stick ist einen variablen Laufwerksbuchstaben einzubauen ?

Habe jetzt mal rumprobiert, aber leider kann er dann die .exe nicht mehr finden face-confused

$USBDrive = Get-WmiObject Win32_Volume -Filter "DriveType='2'"|select -expand driveletter  
$version ='4.5.0'   
$mapping = @{ 
'4.5.0' = '$USBDrive\update-v4.5.0-v4.5.3.exe'   
'4.5.3' = '$USBDrive\update-v4.5.3-v4.6.2.exe'   
'4.6.2' = '$USBDrive\update-v4.6.2-v4.6.3.exe'   
} 
if ($mapping[$version]){ 
start-process -FilePath $mapping[$version] -wait 
}else{ 
write-host "Keine bekannte Version" -ForeGroundColor Yellow  
Remove-Item $OutFile 
}

VG

Hanuta
Mitglied: 114757
114757 23.11.2015 aktualisiert um 15:01:11 Uhr
Goto Top
Den Laufwerksbuchstaben von dem das Script aus aufgerufen wurde bekommst du so:
PS 2.0
Split-Path $MyInvocation.MyCommand.Path -Qualifier
oder
[System.IO.Path]::GetPathRoot($MyInvocation.MyCommand.Path)
Ab PS 3.0:
Split-Path $PSCommandPath -Qualifier
Mitglied: Woraxor
Woraxor 23.11.2015 um 15:05:05 Uhr
Goto Top
Super, hat funktioniert face-smile

hab ich jetzt noch die möglichkeit die Abfrage in eine Foreach Schleife zu setzen ?

Klappt aber noch net so ganz -.- (bin noch Anfänger in PS^^)

foreach($version in $versions) {
$version ='4.5.0'   
$mapping = @{ 
'4.5.0' = "$USBDrive\update-v4.5.0-v4.5.3.exe"   
'4.5.3' = "$USBDrive\update-v4.5.3-v4.6.2.exe"   
'4.6.2' = "$USBDrive\update-v4.6.2-v4.6.3.exe"   
} 
if ($mapping[$version]){ 
start-process -FilePath $mapping[$version] -wait 
}else{ 
write-host "Keine bekannte Version" -ForeGroundColor Yellow  
}
}



VG

Hanuta
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:00:11 Uhr
Goto Top
Zeile 2 weglassen ...(du weist ja sonst der Schleifenvariablen immer den selben Wert zu x-))
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:21:05 Uhr
Goto Top
hmm...jetzt bekomm ich die Fehlermeldung: Arryindex wurde als NULL ausgewertet


Zeile:7 Zeichen:14 -.-^^

VG
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:24:27 Uhr
Goto Top
Zitat von @Woraxor:

hmm...jetzt bekomm ich die Fehlermeldung: Arryindex wurde als NULL ausgewertet

Tja uns fehlt hier ja dein Scriptkontext Mister face-sad
Deine Zeile 7 wird wohl kaum hier die Zeile 7 sein so wie du es hier gepostet hast ....
Ein bißchen Köpfchen musst du schon benutzen, nicht gleich bei jedem Fehler aufgeben, sondern die Meldung mal hinterfragen.
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:24:50 Uhr
Goto Top
Foreach ($version in $Versions) {
$mapping = @{ 
'4.5.0' = "$USBDrive\update-v4.5.0-v4.5.3.exe"   
'4.5.3' = "$USBDrive\update-v4.5.3-v4.6.2.exe"   
'4.6.2' = "$USBDrive\update-v4.6.2-v4.6.3.exe"   
} 
if ($mapping[$version]){ 
start-process -FilePath $mapping[$version] -wait 
}else{ 
write-host "Keine bekannte Version" -ForeGroundColor Yellow  
}
}
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:26:46 Uhr
Goto Top
Und wo definierst du $Versions ????????
Nix da davon face-sad
Du hast doch nur eine Version in der Textdatei oder was jetzt??
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:26:20 Uhr
Goto Top
Naja, er versucht das Array einzulesen....bekommt aber nur einen NULL-Wert zurück...das Ergibt doch keinen Sinn? Er liest ja oben die Arrays ein face-confused
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:28:43 Uhr
Goto Top
Zitat von @Woraxor:

Naja, er versucht das Array einzulesen....bekommt aber nur einen NULL-Wert zurück...das Ergibt doch keinen Sinn? Er liest ja oben die Arrays ein face-confused
Quatsch mit Soße wo soll da ein Array sein ?? Da ist keins, ich glaube du hast meinen Code falsch interpretiert !
Bei einer Versionsnummer aus deiner Texdatei brauchst du keine Schleife!
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:28:19 Uhr
Goto Top
jop, habe nur die Version in einer .txt datei
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:29:58 Uhr
Goto Top
Bei einer Versionsnummer aus deiner Texdatei brauchst du keine Schleife! Da ist ja das gute face-wink
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:29:40 Uhr
Goto Top
Okay, nochmal gaaaanz langsam von vorne....

Die Version wird abgefragt, dementsprechend werden die Versionen den install.exe gesetzt gibt es eine möglichkeit das auch als Schleife einzulesen ?
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:30:58 Uhr
Goto Top
Ja, wenn die version von 5.0 auf 5.3 hochgepached wurde dann soll sie von 5.3 auf 6.2 und so weiter gepached werden....bis zum Schluss...dann muss das doch alles in eine Große Schleife wo er immer wieder von vorne anfängt, oder ?
Mitglied: 114757
114757 23.11.2015 aktualisiert um 16:33:29 Uhr
Goto Top
ach so das musst du ja auch erwähnen, das war mir nicht klar ...
Lass das mit der Schleife und rufe einfach das Skript aus sich heraus erneut auf und lese die Versionsnummer direkt aus dem System aus ...
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:35:36 Uhr
Goto Top
okay, dann kommt gleich die nächste Frage.... Das ist eine .ini Datei, wie kann ich dann dort nur die Versionsnr einlesen ? Habe sowas noch nie gemacht....

[VERSION]
version=4.5.0
Mitglied: 114757
114757 23.11.2015 aktualisiert um 18:12:18 Uhr
Goto Top
Zitat von @Woraxor:

okay, dann kommt gleich die nächste Frage.... Das ist eine .ini Datei, wie kann ich dann dort nur die Versionsnr einlesen ? Habe sowas noch nie gemacht....
Hast doch oben geschrieben das du das gemacht hast ?? *Koppschüttel*

Get-IniContent

Function Get-IniContent {       
    [CmdletBinding()]  
    Param(  
        [ValidateNotNullOrEmpty()]  
        [ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".ini")})]    
        [Parameter(ValueFromPipeline=$True,Mandatory=$True)]  
        [string]$FilePath  
    )  
      
    Begin  
        {Write-Verbose "$($MyInvocation.MyCommand.Name):: Function started"}    
          
    Process  
    {  
        Write-Verbose "$($MyInvocation.MyCommand.Name):: Processing file: $Filepath"    
              
        $ini = @{}  
        switch -regex -file $FilePath  
        {  
            "^\[(.+)\]$" # Section    
            {  
                $section = $matches[1]  
                $ini[$section] = @{}  
                $CommentCount = 0  
            }  
            "^(;.*)$" # Comment    
            {  
                if (!($section))  
                {  
                    $section = "No-Section"    
                    $ini[$section] = @{}  
                }  
                $value = $matches[1]  
                $CommentCount = $CommentCount + 1  
                $name = "Comment" + $CommentCount    
                $ini[$section][$name] = $value  
            }   
            "(.+?)\s*=\s*(.*)" # Key    
            {  
                if (!($section))  
                {  
                    $section = "No-Section"    
                    $ini[$section] = @{}  
                }  
                $name,$value = $matches[1..2]  
                $ini[$section][$name] = $value  
            }  
        }  
        Write-Verbose "$($MyInvocation.MyCommand.Name):: Finished Processing file: $FilePath"    
        Return $ini  
    }  
          
    End  
        {Write-Verbose "$($MyInvocation.MyCommand.Name):: Function ended"}    
} 

$ini = Get-IniContent 'C:\temp\demo.ini'  
$usbdrive = Split-Path $MyInvocation.MyCommand.Path -Qualifier

$mapping = @{
'4.5.0' = "$usbdrive\update-v4.5.0-v4.5.3.exe"  
'4.5.3' = "$usbdrive\update-v4.5.3-v4.6.2.exe"  
'4.6.2' = "$usbdrive\update-v4.6.2-v4.6.3.exe"  
}

$version_start = $null

$mapping.GetEnumerator() | sort Name | select -Expand Name | %{
    if($_ -eq $ini.Version.version){$version_start = $true}
    if ($version_start){
        Write-Host "Updating version '$_' ..."  
        $result = start-process -FilePath $mapping[$_] -wait -passthru
        write-host "Installation wurde mit Code $($result.ExitCode) beendet.`n$('-'*30)"  
    }
}
Mitglied: Woraxor
Woraxor 23.11.2015 um 16:48:08 Uhr
Goto Top
eingelesen und dann im Textdokument bearbeitet